ViewResolver使用Java注释

在Spring 3.1.1中是否可以使用Java注释配置视图解析器?

我已经完成了使用Java注释的所有配置,但我被卡在视图解析器中

package com; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DriverManagerDataSource; import javax.sql.DataSource; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import com.*; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.UrlBasedViewResolver; import org.springframework.web.servlet.view.JstlView; @Configuration @ComponentScan("com") public class AppConfig { { //Other bean declarations } @Bean public UrlBasedViewResolver urlBasedViewResolver() { UrlBasedViewResolver res = new InternalResourceViewResolver(); res.setViewClass(JstlView.class); res.setPrefix("/WEB-INF/"); res.setSuffix(".jsp"); return res; } } 

我使用此代码并运行应用程序,但它没有返回适当的视图。 但是,如果我在app-servlet.xml文件中配置一个viewresolver ,它可以正常工作。

您的类应该扩展WebMvcConfigurerAdapter类。 请看下面的例子

 @Configuration @ComponentScan(basePackages="com") @EnableWebMvc public class MvcConfiguration extends WebMvcConfigurerAdapter{ @Bean public ViewResolver getViewResolver(){ InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return resolver; } } 

我使用Spring 4.3.4测试了你的场景,它运行正常。 我建议您仔细检查您扫描的软件包,并正确提供AppConfig。 我将从AppConfig开始附加所有文件。 然而,扩展WebMvcConfigurerAdapter是件好事。 附带的源代码并不理想,它过于简单,只是为了尝试重现您报告的问题。

从AppConfig开始:

 package com; import org.springframework.context.annotation.*; import org.springframework.web.servlet.view.*; @Configuration @ComponentScan("com") public class AppConfig { @Bean public UrlBasedViewResolver getViewResovler() { UrlBasedViewResolver urlBasedViewResolver = new UrlBasedViewResolver(); urlBasedViewResolver.setViewClass(JstlView.class); urlBasedViewResolver.setPrefix("/WEB-INF/jsp/"); urlBasedViewResolver.setSuffix(".jsp"); return urlBasedViewResolver; } } 

然后:

 package com; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class[] getRootConfigClasses() { return new Class[] { }; } @Override protected Class[] getServletConfigClasses() { return new Class[] { AppConfig.class }; } @Override protected String[] getServletMappings() { return new String[] { "/" }; } } 

最后:

 package com; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class MainController { @RequestMapping("/") public ModelAndView asdf() { return new ModelAndView("ABC"); } } 

上面的问题是在定义bean getViewResolver之前调用DispatcherServlet.initViewResolvers并且它找不到bean,因此它永远不会添加视图解析器。

如果将bean定义移动到xml定义中,它就会被拾取。 由于某种原因,如果XML中没有定义ViewResolvers,则您定义的MvcConfiguration类不会触发DispatcherServlet刷新。