2013-12-03 4 views
1

У меня возникли проблемы с моей конфигурацией spring + jsf. Я использовал WebApplicationInitializer для загрузки ContextLoaderListener и RequestContextListener.Нет найденного WebApplicationContext?

public class Initializer implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 

     AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); 
     ctx.register(WebAppConfig.class); 

     servletContext.addListener(new ContextLoaderListener(ctx)); 
     servletContext.addListener(new RequestContextListener()); 
    } 
} 

WebAppConfig класс:

@Configuration 
@ComponentScan({"web.beans","web.config","web.services"}) 
public class WebAppConfig { 
} 

В моих гранях-config.xml у меня есть:

<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 

И мой web.xml является довольно стандартным:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0"> 
    <display-name>SpringWeb</display-name> 

    <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> 

    <context-param> 
     <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description> 
     <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
     <param-value>client</param-value> 
    </context-param> 

    <session-config> 
     <session-timeout>10</session-timeout> 
    </session-config> 

    <welcome-file-list> 
     <welcome-file>index.xhtml</welcome-file> 
    </welcome-file-list> 
</web-app> 

Мой пом:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>web</groupId> 
<artifactId>SpringWeb</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>war</packaging> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <jsf.version>2.1.3</jsf.version> 
    <spring.version>3.2.5.RELEASE</spring.version> 
</properties> 

<dependencies> 

    <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.9</version> 
    </dependency> 

    <!-- Spring implementation --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aop</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aspects</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <!-- CGLIB is required to process @Configuration classes --> 
    <dependency> 
     <groupId>cglib</groupId> 
     <artifactId>cglib</artifactId> 
     <version>2.2.2</version> 
    </dependency> 

    <!-- Jsf --> 
    <dependency> 
     <groupId>com.sun.faces</groupId> 
     <artifactId>jsf-api</artifactId> 
     <version>${jsf.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.faces</groupId> 
     <artifactId>jsf-impl</artifactId> 
     <version>${jsf.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jstl</artifactId> 
     <version>1.2</version> 
    </dependency> 

    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.1.0</version> 
    </dependency> 

    <dependency> 
     <groupId>org.glassfish.web</groupId> 
     <artifactId>el-impl</artifactId> 
     <version>2.2</version> 
    </dependency> 

    <dependency> 
     <groupId>org.primefaces</groupId> 
     <artifactId>primefaces</artifactId> 
     <version>4.0</version> 
    </dependency> 

</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

Im работает приложение на Tomcat 7 и вот мой трассировки стека:

java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered? 
org.springframework.web.jsf.FacesContextUtils.getRequiredWebApplicationContext(FacesContextUtils.java:83) 
org.springframework.web.jsf.el.SpringBeanFacesELResolver.getWebApplicationContext(SpringBeanFacesELResolver.java:91) 
org.springframework.web.jsf.el.SpringBeanFacesELResolver.getBeanFactory(SpringBeanFacesELResolver.java:79) 
org.springframework.beans.factory.access.el.SpringBeanELResolver.getValue(SpringBeanELResolver.java:50) 
com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) 
com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) 
org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:72) 
org.apache.el.parser.AstValue.getValue(AstValue.java:161) 

Из того, что я собрал весной документы, WebApplicationInitializer и web.xml (3.0) дополняют друг друга, так Я не могу понять, что случилось ...

большой ТНХ заранее

Update: На первом развертывании я получаю сообщение об ошибке, на втором развернуть приложение начинает

+0

Убедитесь, что ваш web.xml на самом деле является версией 3.0 и убедитесь, что в вашем заголовке нет 'metadata-complete =" true "'. Также почему вы смешиваете web.xml и 'WebApplicationInitializer'? Почему бы вам просто не добавить сервлет к инициализатору? –

+0

это версия 3.0, у меня нет метаданных-complete = "true". Дело в том, что я не знаю, как добавить javax.faces.webapp.FacesServlet в initalizer :-) – Stiv

+0

То же, что и фильтр, но с помощью метода 'addServlet'. Я предлагаю вам взглянуть на [javadoc] (http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContext.html#addServlet (java.lang.String, java.lang.Class)) для 'ServletContext'. Также вы можете опубликовать/добавить заголовок вашего web.xml (для полного насыщения). –

ответ

2

Конфигурация Maven определяет 2 зависимостей как компилировать (по умолчанию), в то время как они должны быть указаны в качестве при условии. По крайней мере, сервлет-апи должна быть ограничена, как при условии

<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>javax.servlet-api</artifactId> 
    <version>3.1.0</version> 
    <scope>provided</scope> 
</dependency> 

Проблема с добавлением сервлет-API для вашей войны файл является то, что он будет (может) привести к проблемам класса нагрузки. Тот же класс доступен в двух разных загрузчиках классов, и поэтому ServletContainerInitializer от CL1 не совпадает с ServletContainerInitializer от CL2 (идентификатор класса основан на классе-name + classloader).

Это приводит к не обнаружению SpringServletContainerInitializer, который отвечает за загрузку WebApplicationInitializer.

+0

еще раз, thx – Stiv

Смежные вопросы