2011-02-08 2 views
6

Я развертываю портлеты на Liferay 5.2.3 на Tomcat 6. Я получаю эту ошибку только для одного из портлетов.java.lang.IllegalStateException: Атрибут корневого контекста не относится к типу WebApplicationContext

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

Я провел некоторое исследование и выяснил, что Spring создавала контекст приложения портлета, когда ему нужен веб-сайт. Но в моем web.xml я только определение contextLoaderListner

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

И в довершение, если другой * .jar файл был просматриваемое к весне, то почему бы другие мои портлетов получить развернутый, кроме одного?

После нескольких перераспределений я получаю это до исправления. Может ли кто-нибудь осветить?

ответ

0

Похоже, вы не определяете contextConfigLocation? в web.xml вы также должны иметь что-то подобное в дополнение к 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> 

Где applicationContext.xml нормальный конфигурационный файл для веб-приложение.

Вы также должны иметь это в вашем web.xml при использовании пружинных портлетов 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> 

В вашем portlet.xml я думаю, у вас есть что-то вроде этого, чтобы указать портлет:

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

Если вы еще этого не сделали, см. Ссылку на портлет mvc с пружиной documentation

Надеюсь, что это поможет.

1

Основная причина, по-видимому, является статической переменной на сервере портала/приложения, «зависающей» с экземпляром класса из портлета. Двумя общими виновниками являются log4j и java каротаж, оба из которых обычно используются в приложениях.

См. log4j and the thread context classloader и http://logback.qos.ch/manual/loggingSeparation.html для более подробного обсуждения лесорубов. Предложение состоит в том, чтобы использовать SLF4J с логикой или, конечно, поставить log4j.jar в ваш WAR-файл, чтобы он находился в правильном загрузчике классов (хотя некоторые контейнеры будут препятствовать этому решению).

Кроме того, причиной может быть и другой класс, который присутствует в контейнере. Регистрация - это обычная проблема.

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