【问题标题】:How can implement AbstractAnnotationConfigDispatcherServletInitializer for java config on my spring 3.2 and hibernate 4 integration project?如何在我的 spring 3.2 和 hibernate 4 集成项目中为 java config 实现 AbstractAnnotationConfigDispatcherServletInitializer?
【发布时间】:2013-08-04 21:03:05
【问题描述】:

在我的应用程序中,我使用的是 spring 3.2、jsf 2.1 和 hibernate 4 集成。我想将配置 xml 文件替换为 java config。为此,我专注于 AbstractAnnotationConfigDispatcherServletInitializer 和 WebMvcConfigurerAdapter 部分。

web.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name />
<context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>
   /WEB-INF/applicationContext.xml
   </param-value>
</context-param>
<listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class>
</listener>
<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>
<filter>
    <description>generated-persistence-filter</description>
    <filter-name>MySQLFilter</filter-name>
    <filter-class>
        org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
    </filter-class>
    <init-param>
        <param-name>entityManagerFactoryBeanName</param-name>
        <param-value>MySQL</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>MySQLFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>   
<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
</context-param>
<context-param>
    <param-name>com.sun.faces.expressionFactory</param-name>
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value>
</context-param>
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/jsf/login.xhtml</location>
</error-page>
</web-app>

如何在 javaconfig 类上实现 context-param、welcome-file-list 和 error-page。

我的 javaconfig 类是,

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

@Override
protected Class<?>[] getRootConfigClasses() {
    return null;
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[] { WebConfig.class };
}

@Override
protected String[] getServletMappings() {
    return new String[] { "/", "/*", "*.faces", "*.xhtml" };
}

@Override  // for representing Faces Serelet context, is it correct?
public void onStartup(ServletContext servletContext)
        throws ServletException {
    servletContext.addServlet("Faces Servlet", "javax.faces.webapp.FacesServlet");


    super.onStartup(servletContext);
}

@Override
protected Filter[] getServletFilters() {

    CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
    characterEncodingFilter.setEncoding("UTF-8");

    OpenEntityManagerInViewFilter openEntityManagerInViewFilter = new OpenEntityManagerInViewFilter();
    openEntityManagerInViewFilter.setPersistenceUnitName("MySQL");
    return new Filter[] { characterEncodingFilter, openEntityManagerInViewFilter, new org.primefaces.webapp.filter.FileUploadFilter()};
}
}

@Configuration
@EnableWebMvc
@Import(DatabaseConfig.class)
@ComponentScan(basePackages = { "com.shiv.ShivCDB.web.jsf", "com.shiv.ShivCDB.service" })
public class WebConfig extends WebMvcConfigurerAdapter {

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}

@Override
public void addInterceptors(InterceptorRegistry registry) {

    LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
    localeChangeInterceptor.setParamName("lang");
    registry.addInterceptor(localeChangeInterceptor);
}

@Bean
public SimpleMappingExceptionResolver simpleMappingExceptionResolver() {
    SimpleMappingExceptionResolver b = new SimpleMappingExceptionResolver();

    Properties mappings = new Properties();
    mappings.put("org.springframework.web.servlet.PageNotFound", "p404");
    mappings.put("org.springframework.dao.DataAccessException", "dataAccessFailure");
    mappings.put("org.springframework.transaction.TransactionException", "dataAccessFailure");
    b.setExceptionMappings(mappings);
    return b;
}

@Bean
public LocaleResolver localeResolver() {

    CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
    cookieLocaleResolver.setDefaultLocale(StringUtils.parseLocaleString("en"));
    return cookieLocaleResolver;
}

@Bean
public ViewResolver viewResolver() {

    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setViewClass(JstlView.class);
    viewResolver.setPrefix("/WEB-INF/views");
    viewResolver.setSuffix(".jsp");
    return viewResolver;
}

@Bean
public MessageSource messageSource() {

    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasenames("classpath:messages/messages", "classpath:messages/validation");
    // if true, the key of the message will be displayed if the key is not
    // found, instead of throwing a NoSuchMessageException
    messageSource.setUseCodeAsDefaultMessage(true);
    messageSource.setDefaultEncoding("UTF-8");
    // # -1 : never reload, 0 always reload
    messageSource.setCacheSeconds(0);
    return messageSource;
}
}

【问题讨论】:

  • 看起来像一个与 JSF 无关的 spring 和 hibernate 问题。请注意,此处的 JSF 将仅充当 HTML 生成器。
  • 如何在 spring 3.2 java 配置类上实现 context-param、welcome-file-list 和 error-page (web.xml) 等属性。

标签: java spring hibernate


【解决方案1】:

您需要在 onStartup 方法中注册 spring ContextLoaderListener,用于 xml 配置:

public void onStartup(ServletContext servletContext) {
    XmlWebApplicationContext root = new XmlWebApplicationContext
    root.setConfigLocation("/WEB-INF/applicationContext.xml")
    servletContext.addListener(new ContextLoaderListener(root))
}

对于 java 配置:

public void onStartup(ServletContext servletContext) {
    AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext
//scan the package of your @Configuration java files
    root.scan("org.example.config")
    servletContext.addListener(new ContextLoaderListener(root))
}

看起来欢迎文件列表和错误页面没有注释或 java 配置支持,您仍然需要在 web.xml 中定义它们,并且 servlet 容器将同时加载 web.xml 和 WebInitializer。

如果你想彻底摆脱 web.xml,你可以尝试在你的 web 框架中实现欢迎文件和错误页面。

--编辑--

我对jsf不熟悉,你可以尝试在onStartup方法中添加以下内容:

servletContext.setInitParameter("javax.faces.STATE_SAVING_METHOD", "server");
servletContext.setInitParameter("com.sun.faces.expressionFactory", "com.sun.el.ExpressionFactoryImpl");

【讨论】:

  • 感谢您的建议。我正在执行框架级别的错误页面和欢迎文件。但是在 web.xml 上还存在像 javax.faces.STATE_SAVING_METHOD 和 com.sun.faces.expressionFactory 这样的 。如何在 WebInitializer java config 上实现它
猜你喜欢
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多