2011-02-08 6 views
6

Wdrażam portlety w Liferay 5.2.3 na serwerze Tomcat 6. Ten błąd występuje tylko w jednym z portletów.java.lang.IllegalStateException: Atrybut kontekstu głównego nie jest typu WebApplicationContext

java.lang.IllegalStateException: Root context attribute is not of type WebApplicationContext 

Zrobiłem rozeznanie i okazało się, że wiosna była instancji kontekstu aplikacji portlet gdy potrzebujemy sieci jeden. Ale w moim web.xml jestem definiowania contextLoaderListner

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

I do góry go tylko wtedy, gdy inny plik * .jar był spojrzał przez wiosnę, to dlaczego moi innych portletów się wdrożyć z wyjątkiem jednego?

Po kilku przesunięciach uzyskuję poprawkę. Czy ktoś może zapalić światło?

Odpowiedz

0

Wygląda na to, że nie definiujesz contextConfigLocation? w web.xml należy również mieć coś takiego oprócz contextLoaderListener:

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/applicationContext.xml  
    </param-value> 

</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

Gdzie applicationContext.xml jest normalny plik konfiguracyjny dla webapp.

Trzeba również w tym przypadku korzystania web.xml wiosna portletu MVC:

<servlet> 
    <servlet-name>ViewRendererServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.ViewRendererServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>ViewRendererServlet</servlet-name> 
    <url-pattern>/WEB-INF/servlet/view</url-pattern> 
</servlet-mapping> 

w twojej portlet.xml Chyba masz coś takiego, aby określić portletów:

<portlet> 
<portlet-name>sample</portlet-name> 
<portlet-class>org.springframework.web.portlet.DispatcherPortlet</portlet-class> 
<supports> 
    <mime-type>text/html</mime-type> 
    <portlet-mode>view</portlet-mode> 
</supports> 
<portlet-info> 
    <title>Sample Portlet</title> 
</portlet-info> 
</portlet> 

Jeśli jeszcze tego nie zrobiłeś, zobacz portletu źródłowego mvc nr documentation

Mam nadzieję, że to pomoże.

1

Podstawową przyczyną wydaje się być zmienna statyczna w portalu/serwerze aplikacji "zawieszająca się" na instancji klasy z portletu. Dwoma typowymi winowajcami są log4j i logowanie java, które są powszechnie używane przez kontenery aplikacji.

Więcej informacji na temat rejestratorów można znaleźć pod numerami log4j and the thread context classloader i http://logback.qos.ch/manual/loggingSeparation.html. Sugerujemy użycie SLF4J z funkcją logback OR, aby upewnić się, że umieściliśmy plik log4j.jar w pliku WAR, więc znajduje się on we właściwym programie ładującym klasy (chociaż niektóre kontenery uniemożliwiają to rozwiązanie).

Może to również być przyczyną obecności innej klasy znajdującej się w kontenerze. Logowanie jest tylko częstym problemem.

Powiązane problemy