2016-11-02 12 views
1

2つのビューリゾルバを設定するSpringベースのアプリケーションを設定しようとしています。コントローラから、 "login"のような文字列名だけを返すと、Thymeleafリゾルバで処理されますが、コントローラのメソッドがオブジェクトを返す場合は、適切なjsonビューを使用する必要があります。私は、以下の設定どおりに自分のアプリケーションを実行しようとすると、私は複数のビューリゾルバの設定(ThymeleafとJson)Spring

「名前 とサーブレットでの名前のログイン」と見解を解決できませんでした 『ディスパッチャー』」次のエラーを取得する

君たちの要求以下のJavaクラスを参照してください。最初は設定クラス、2番目は使用しようとしているコントローラです。

package com.gojha.web; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.http.MediaType; 
import org.springframework.web.accept.ContentNegotiationManager; 
import org.springframework.web.servlet.ViewResolver; 
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; 
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
import org.springframework.web.servlet.view.ContentNegotiatingViewResolver; 
import org.thymeleaf.TemplateEngine; 
import org.thymeleaf.spring4.SpringTemplateEngine; 
import org.thymeleaf.spring4.view.ThymeleafViewResolver; 
import org.thymeleaf.templateresolver.ServletContextTemplateResolver; 
import org.thymeleaf.templateresolver.TemplateResolver; 

@Configuration 
@EnableWebMvc 
@ComponentScan("com.gojha.web") 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 

    @Bean 
    public ViewResolver viewResolver(ContentNegotiationManager cnm) { 
     ContentNegotiatingViewResolver cnvr = new ContentNegotiatingViewResolver(); 
     cnvr.setContentNegotiationManager(cnm); 
     return cnvr; 
    } 

    @Override 
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { 
     configurer.defaultContentType(MediaType.APPLICATION_JSON); 
    } 


    @Bean 
    public TemplateResolver templateResolver() { 
     TemplateResolver templateResolver = new ServletContextTemplateResolver(); 
     templateResolver.setPrefix("/WEB-INF/templates/"); 
     templateResolver.setSuffix(".html"); 
     templateResolver.setTemplateMode("HTML5"); 
     return templateResolver; 
    } 

    @Bean 
    public TemplateEngine templateEngine() { 
     SpringTemplateEngine templateEngine = new SpringTemplateEngine(); 
     templateEngine.setTemplateResolver(templateResolver()); 
     return templateEngine; 
    } 

    @Bean 
    public ViewResolver viewResolver() { 
     ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); 
     viewResolver.setTemplateEngine((SpringTemplateEngine) templateEngine()); 
     return viewResolver; 
    } 

} 

コントローラ

package com.gojha.web; 

import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.client.RestTemplate; 

import static org.springframework.web.bind.annotation.RequestMethod.*; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 

@Controller 
@RequestMapping("/") 
public class LoginController { 

    private RestTemplate restTemplate; 

    private class Test { 
     private String a; 

     public Test() { 
      super(); 
     } 

     public Test(String a) { 
      super(); 
      this.a = a; 
     } 

     public String getA() { 
      return a; 
     } 

     public void setA(String a) { 
      this.a = a; 
     } 

    } 

    @Autowired 
    public LoginController(RestTemplate restTemplate) { 
     this.restTemplate = restTemplate; 
    } 

    @RequestMapping(method=GET) 
    public String testing(){ 
     return "login"; 
    } 

    @RequestMapping(method=GET, produces="application/json") 
    public Test testing2(){ 
     return new Test("wow"); 
    } 
} 

私は、コードは自明であると思います。

+0

テンプレートフォルダ内にlogin.htmlがありますか? – developer

+0

はい。私がただ1つのviewResolverを使用すると、thymeleafと言うとすべてが機能します。 –

答えて

0

構成ファイルを変更し、リゾルバを表示するために注文を割り当てることで、問題なく動作しました。私が理解するところでは、まずContentNegotiationを使ってビューを解決しようとしているように見え、失敗した場合はThymeleafリゾルバに戻ります。私はこれを答えとしてマークしています。誰かがより良いアプローチをしている場合、あるいは示唆された訂正があれば教えてください。

package com.gojha.web; 

import java.util.ArrayList; 
import java.util.List; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.http.MediaType; 
import org.springframework.web.accept.ContentNegotiationManager; 
import org.springframework.web.servlet.View; 
import org.springframework.web.servlet.ViewResolver; 
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
import org.springframework.web.servlet.view.ContentNegotiatingViewResolver; 
import org.springframework.web.servlet.view.json.MappingJackson2JsonView; 
import org.thymeleaf.spring4.SpringTemplateEngine; 
import org.thymeleaf.spring4.view.ThymeleafViewResolver; 
import org.thymeleaf.templateresolver.ServletContextTemplateResolver; 
import org.thymeleaf.templateresolver.TemplateResolver; 

@Configuration 
@EnableWebMvc 
@ComponentScan("com.gojha.web") 
public class WebConfig extends WebMvcConfigurerAdapter { 


    @Override 
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { 
     configurer.defaultContentType(MediaType.APPLICATION_JSON); 
    } 

    @Bean 
    public ViewResolver viewResolver() { 

     TemplateResolver templateResolver = new ServletContextTemplateResolver(); 
     templateResolver.setPrefix("/WEB-INF/templates/"); 
     templateResolver.setSuffix(".html"); 
     templateResolver.setTemplateMode("HTML5"); 

     SpringTemplateEngine templateEngine = new SpringTemplateEngine(); 
     templateEngine.setTemplateResolver(templateResolver); 

     ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); 
     viewResolver.setTemplateEngine(templateEngine); 
     viewResolver.setOrder(2); 
     return viewResolver; 
    } 

    @Bean 
    public ViewResolver cnViewResolver(ContentNegotiationManager cnm) { 
     ContentNegotiatingViewResolver cnvr = new ContentNegotiatingViewResolver(); 
     cnvr.setContentNegotiationManager(cnm); 
     cnvr.setOrder(1); 
     List<View> views = new ArrayList<View>(); 
     views.add(jsonView()); 
     cnvr.setDefaultViews(views); 
     return cnvr; 
    } 

    @Bean 
    public View jsonView() { 
     MappingJackson2JsonView view = new MappingJackson2JsonView(); 
     view.setPrettyPrint(true); 
     return view; 
    } 

} 
関連する問題