我正在Tomcat 6上的Liferay 5.2.3上部署Portlets。我只为其中一个portlet收到此错误。
java.lang.IllegalStateException: Root context attribute is not of type WebApplicationContext
我做了一些研究,发现Spring在需要web时实例化portlet应用程序上下文。但在我的web.xml中,我只定义了contextLoaderListner
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
最重要的是,如果Spring正在查找不同的* .jar文件,为什么我的其他portlet会被部署,除了一个?
经过几次重新部署后,我得到了解决方案。有人能说些什么吗?
答案 0 :(得分:1)
根本原因似乎是门户/应用程序服务器中的一个静态变量“挂在”portlet的类实例上。两个常见的罪魁祸首是log4j和java日志记录,两者都是应用程序包含器常用的。
有关记录器的更多讨论,请参阅log4j and the thread context classloader和http://logback.qos.ch/manual/loggingSeparation.html。建议使用带有logback OR的SLF4J以确保将log4j.jar放在WAR文件中,以便它位于正确的类加载器中(尽管某些容器会阻止此解决方案)。
此外,容器中存在的其他类可能是原因。记录只是一个常见问题。
答案 1 :(得分: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是webapp的普通配置文件。
如果使用spring portlet MVC:
,您还应该在web.xml中使用它<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>
<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>
如果您还没有,请参阅spring portlet mvc reference documentation
希望它有所帮助。