1

在我的应用程序中,我使用的是 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;
}
}
4

1 回答 1

3

您需要在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");
于 2013-08-05T00:41:04.187 回答