【问题标题】:ViewResolver using Java annotation使用 Java 注解的 ViewResolver
【发布时间】:2013-01-03 19:37:18
【问题描述】:

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

我已经使用 Java 注释完成了所有配置,但我被困在 view resolver

代码

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,它可以正常工作。

【问题讨论】:

  • 到底是什么问题?视图解析器是普通的bean,如果你使用@Configuration,使用@Bean来声明它们。
  • @axtavt 请看看我更新的问题。

标签: java spring model-view-controller spring-mvc annotations


【解决方案1】:

我用 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");
    }
}

【讨论】:

    【解决方案2】:

    上面的问题是在定义bean getViewResolver之前调用了DispatcherServlet.initViewResolvers get,它找不到bean,所以它从不添加视图解析器。

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

    【讨论】:

      【解决方案3】:

      您的类应该扩展 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;
          }
      }
      

      【讨论】:

      • 它当然不必扩展 WebMvcConfigurerAdapter(如上面的 axtact 所述),但这是一个好方法。
      • 您可以发布上述场景的示例吗?
      • WebMvcConfigurerAdapter 类型已弃用
      猜你喜欢
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      相关资源
      最近更新 更多