我开始将Tomcat 6中的wep应用程序更新为当前版本的Tomcat(7-27)。当我使用以下错误消息启动服务器时出现问题:
错误LifeCycle - 无法启动对象 org.gatein.pc.portlet.container.PortletInitializationException:无法使用类com.qnamic.railopt.web.security.portlet.PortletSecurityFilter创建过滤器,因为它未实现预期的接口javax.portlet.filter.PortletFilter 在org.gatein.pc.portlet.impl.jsr168.ClassInstanceLifeCycle.create(ClassInstanceLifeCycle.java:85) 在org.gatein.pc.portlet.impl.jsr168.PortletFilterImpl.start(PortletFilterImpl.java:144) 在org.gatein.pc.portlet.impl.container.PortletFilterLifeCycle.invokeStart(PortletFilterLifeCycle.java:66) 在org.gatein.pc.portlet.impl.container.LifeCycle.managedStart(LifeCycle.java:93) 在org.gatein.pc.portlet.impl.container.PortletApplicationLifeCycle.startDependents(PortletApplicationLifeCycle.java:339) 在org.gatein.pc.portlet.impl.container.LifeCycle.managedStart(LifeCycle.java:129) 在org.gatein.pc.mc.PortletApplicationDeployment.install(PortletApplicationDeployment.java:153) 在org.gatein.pc.mc.PortletApplicationDeployer.add(PortletApplicationDeployer.java:216) 在org.gatein.pc.mc.PortletApplicationDeployer.onEvent(PortletApplicationDeployer.java:185) 在org.gatein.wci.impl.DefaultServletContainer.safeFireEvent(DefaultServletContainer.java:200) 在org.gatein.wci.impl.DefaultServletContainer.fireEvent(DefaultServletContainer.java:219) 在org.gatein.wci.impl.DefaultServletContainer.access $ 400(DefaultServletContainer.java:60) 在org.gatein.wci.impl.DefaultServletContainer $ RegistrationImpl.registerWebApp(DefaultServletContainer.java:338) 在org.gatein.wci.tomcat.TC7ServletContainerContext.start(TC7ServletContainerContext.java:380) 在org.gatein.wci.tomcat.TC7ServletContainerContext.lifecycleEvent(TC7ServletContainerContext.java:234) 在org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) 在org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) 在org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:401) 在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:168) 在org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1566) 在org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1556) at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:303) 在java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908) 在java.lang.Thread.run(Thread.java:619) 答:S:R:U:错误LifeCycle - 无法启动对象 org.gatein.pc.portlet.container.PortletInitializationException:无法使用类com.qnamic.railopt.web.core.portal.ContextFilter创建过滤器,因为它没有实现预期的接口javax.portlet.filter.PortletFilter 在org.gatein.pc.portlet.impl.jsr168.ClassInstanceLifeCycle.create(ClassInstanceLifeCycle.java:85) 在org.gatein.pc.portlet.impl.jsr168.PortletFilterImpl.start(PortletFilterImpl.java:144) 在org.gatein.pc.portlet.impl.container.PortletFilterLifeCycle.invokeStart(PortletFilterLifeCycle.java:66) 在org.gatein.pc.portlet.impl.container.LifeCycle.managedStart(LifeCycle.java:93) 在org.gatein.pc.portlet.impl.container.PortletApplicationLifeCycle.startDependents(PortletApplicationLifeCycle.java:339) 在org.gatein.pc.portlet.impl.container.LifeCycle.managedStart(LifeCycle.java:129) 在org.gatein.pc.mc.PortletApplicationDeployment.install(PortletApplicationDeployment.java:153) 在org.gatein.pc.mc.PortletApplicationDeployer.add(PortletApplicationDeployer.java:216) 在org.gatein.pc.mc.PortletApplicationDeployer.onEvent(PortletApplicationDeployer.java:185) 在org.gatein.wci.impl.DefaultServletContainer.safeFireEvent(DefaultServletContainer.java:200) 在org.gatein.wci.impl.DefaultServletContainer.fireEvent(DefaultServletContainer.java:219) 在org.gatein.wci.impl.DefaultServletContainer.access $ 400(DefaultServletContainer.java:60) 在org.gatein.wci.impl.DefaultServletContainer $ RegistrationImpl.registerWebApp(DefaultServletContainer.java:338) 在org.gatein.wci.tomcat.TC7ServletContainerContext.start(TC7ServletContainerContext.java:380) 在org.gatein.wci.tomcat.TC7ServletContainerContext.lifecycleEvent(TC7ServletContainerContext.java:234) 在org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) 在org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) 在org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:401) 在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:168) 在org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1566) 在org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1556) at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:303) 在java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908) 在java.lang.Thread.run(Thread.java:619)
com.qnamic.railopt.web.security.portlet.PortletSecurityFilter类实现了接口javax.portlet.filter.PortletFilter:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.Principal;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.EventRequest;
import javax.portlet.EventResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletMode;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;
import javax.portlet.PortletSession;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import javax.portlet.filter.ActionFilter;
import javax.portlet.filter.EventFilter;
import javax.portlet.filter.FilterChain;
import javax.portlet.filter.FilterConfig;
import javax.portlet.filter.RenderFilter;
import javax.portlet.filter.ResourceFilter;
import org.apache.log4j.Logger;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
public class PortletSecurityFilter implements ActionFilter, EventFilter, RenderFilter, ResourceFilter {
ActionFilter实现了javax.portlet.filter.PortletFilter
依赖的罐子是:
某些依赖项具有范围"提供"并且不包括在战争中(因为tomcat没有使用它们)!
我的portlet.xml的一部分
<filter>
<filter-name>PortletSecurityFilter</filter-name>
<filter-class>com.qnamic.railopt.web.security.portlet.PortletSecurityFilter</filter- class>
<lifecycle>ACTION_PHASE</lifecycle>
<lifecycle>EVENT_PHASE</lifecycle>
<lifecycle>RENDER_PHASE</lifecycle>
<lifecycle>RESOURCE_PHASE</lifecycle>
<init-param>
<name>message</name>
<value>Security Filter</value>
</init-param>
</filter>
<filter-mapping>
<filter-name>PortletSecurityFilter</filter-name>
<portlet-name>*</portlet-name>
</filter-mapping>
其他依赖项可在父项目中找到:
当我调试代码时 org.gatein.pc.portlet.impl.jsr168.ClassInstanceLifeCycle.create(...) 它停在第二行
Class clazz = classLoader.loadClass(className);
if (expectedClass.isAssignableFrom(clazz)) {
Class<? extends T> castedClass = clazz.asSubclass(expectedClass);
Constructor<? extends T> ctor = castedClass.getConstructor();
instance = ctor.newInstance();
}
else {
String msg = "Cannot create " + type + " with class " + className + " because it does not implement the expected interface " + expectedClass.getName();
throw new PortletInitializationException(msg);
}
我的建议首先是类加载器存在问题,但它不应该是,因为第一行正确加载了类PortletSecurityFilter。正如预期的那样,期望的类是javax.portlet.filter.PortletFilter。为什么班级不能分配?
感谢您的帮助!
答案 0 :(得分:1)
我必须承认,我不知道您用来解决此问题的GateIn的确切版本是什么,但无论如何,我可以通过简单地保留(故意)portlet来重现GateIn-3.2.0.Final-tomcat7的这个问题。我的war文件的WEB-INF / lib目录中的api-2.0.jar。我可以得到类似的东西:
28 janv. 2013 15:48:09 org.gatein.common.logging.Logger log
GRAVE: Cannot start object
org.gatein.pc.portlet.container.PortletInitializationException: Cannot create filter with class org.exoplatform.tutorial.portlet.MyPortletFilter because it does not implement the expected interface javax.portlet.filter.PortletFilter
at org.gatein.pc.portlet.impl.jsr168.ClassInstanceLifeCycle.create(ClassInstanceLifeCycle.java:85)
at org.gatein.pc.portlet.impl.jsr168.PortletFilterImpl.start(PortletFilterImpl.java:144)
at org.gatein.pc.portlet.impl.container.PortletFilterLifeCycle.invokeStart(PortletFilterLifeCycle.java:66)
at org.gatein.pc.portlet.impl.container.LifeCycle.managedStart(LifeCycle.java:93)
at org.gatein.pc.portlet.impl.container.PortletApplicationLifeCycle.startDependents(PortletApplicationLifeCycle.java:339)
at org.gatein.pc.portlet.impl.container.LifeCycle.managedStart(LifeCycle.java:129)
at org.gatein.pc.portlet.impl.deployment.PortletApplicationDeployment.install(PortletApplicationDeployment.java:153)
at org.gatein.pc.portlet.impl.deployment.PortletApplicationDeployer.add(PortletApplicationDeployer.java:199)
at org.gatein.pc.portlet.impl.deployment.PortletApplicationDeployer.onEvent(PortletApplicationDeployer.java:168)
at org.gatein.wci.impl.DefaultServletContainer.safeFireEvent(DefaultServletContainer.java:200)
at org.gatein.wci.impl.DefaultServletContainer.addWebAppListener(DefaultServletContainer.java:166)
at org.gatein.pc.portlet.impl.deployment.PortletApplicationDeployer.start(PortletApplicationDeployer.java:241)
at org.exoplatform.portal.pc.ExoKernelIntegration.start(ExoKernelIntegration.java:178)
at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.exoplatform.container.LifecycleVisitor.traverse(LifecycleVisitor.java:100)
at org.exoplatform.container.LifecycleVisitor.start(LifecycleVisitor.java:170)
at org.exoplatform.container.ConcurrentPicoContainer.start(ConcurrentPicoContainer.java:554)
at org.exoplatform.container.ExoContainer.start(ExoContainer.java:266)
at org.exoplatform.container.PortalContainer.start(PortalContainer.java:667)
at org.exoplatform.container.ExoContainer.start(ExoContainer.java:254)
at org.exoplatform.container.RootContainer.createPortalContainer(RootContainer.java:399)
at org.exoplatform.container.RootContainer.registerPortalContainer(RootContainer.java:266)
at org.exoplatform.portal.application.PortalController.afterInit(PortalController.java:114)
at org.exoplatform.container.web.AbstractHttpServlet.init(AbstractHttpServlet.java:79)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1201)
我可以通过简单地从我的webapp的WEB-INF / lib中删除portlet-api-2.0.jar来修复它(或者在提供的maven中定义这种依赖关系)。这只是因为jar文件已经在tomcat / lib中,所以Portlet Container引用了从Tomcat的公共ClassLoader加载的类javax.portlet.filter.PortletFilter,而你的Filter实现了类javax.portlet.filter。已经从webapp的ClassLoader(来自WEB-INF / lib)加载的PortletFilter,即使这两个类的FQN相等,它们也不被视为同一类,因为expectedClass.isAssignableFrom(clazz)返回false。