2012-05-21 34 views
0

我開始將wep應用程序從Tomcat 6更新到當前版本的Tomcat(7-27)。當我啓動服務器,出現以下錯誤消息的問題出現了:生命週期錯誤 - 未實現正確的接口javax.portlet.filter.PortletFilter

ERROR生命週期 - 不能啓動對象 org.gatein.pc.portlet.container.PortletInitializationException:無法創建類com.qnamic.railopt過濾器.web.security.portlet.PortletSecurityFilter,因爲它沒有實現期望的接口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.im pl.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) at org.gatein.pc.mc.PortletApplicationDeployment.install(PortletApplicationDeployment.java:153) at org.gatein.pc.mc.PortletApplicationDeployer.add(PortletApplicationDeployer.java: 216) at org.gatein.pc.mc.PortletApplicationDeployer.onEvent(PortletApplicationDeployer.java:185) at org.gatein.wci.impl.DefaultServletContainer.safeFireEvent(DefaultServletContainer.java:200) at org.gatein.wci。 impl.DefaultServletContainer.fireEvent(DefaultServletContainer.java:219) at org.gatein。 (org.gatein.wci.impl.DefaultServletContainer $ RegistrationImpl.registerWebApp(DefaultServletContainer.java:338) at 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) 在有機.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:401) at org.apache.catalina.util.LifecycleBase.start (LifecycleBase.java:168) at org.apache.cat alina.core.ContainerBase $ StartChild.call(ContainerBase.java:1566) at org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1556) at java.util.concurrent.FutureTask $ Sync。內部運行(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886) at java。 A:S:R:U:ERROR LifeCycle - 不能啓動對象 組織。 gatein.pc.portlet.container.PortletInitializationException:無法使用類com.qnamic.railopt.web.core.portal.ContextFilter創建過濾器,因爲它沒有實現預期的接口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) 在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(DefaultServ letContainer.java:338) 在org.gatein.wci.tomcat.TC7ServletContainerContext.start(TC7ServletContainerContext.java:380) 在org.gatein.wci.tomcat.TC7ServletContainerContext.lifecycleEvent(TC7ServletContainerContext.java:234) 在有機apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) at 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)通過java.util.concurrent.FutureTask獲得$ Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor $ Worker。 runTask(ThreadPoolExecutor.java:886) 在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 { 

ActionFi濾波器確實實現javax.portlet.filter.PortletFilter

從屬罐子是:

  • primefaces-3.2.jar
  • 彈簧芯3.0.5.RELEASE.jar
  • 彈簧-ASM -3.0.5.RELEASE.jar
  • 彈簧上下文3.0.5.RELEASE.jar
  • 彈簧AOP-3.0.5.RELEASE.jar
  • 彈簧表達-3.0.5.RELEASE.jar
  • 彈簧webmvc的portlet-3.0.5.RELEASE.jar
  • 彈簧webmvc-3.0.5.RELEASE.jar
  • 彈簧上下文支撐3.0.5.RELEASE.jar
  • portlet的API-2.0.jar
  • 平臺-3.8.0.jar
  • JDO-2.0.jar
  • 科多-runtime.jar
  • OpenJPA的-1.0-快。罐子
  • PlanOpt-3.8.0.jar
  • RailOptBase-3.8.0.jar
  • portletfaces橋-API-2.0.0-RC1.jar
  • portletfaces橋 - IMPL-2.0.0- RC1.jar
  • portletfaces測井-1.1.0.jar
  • 公地集合-3.2.1.jar
  • 彈簧網絡3.0.5.RELEASE.jar
  • aopalliance-1.0.jar
  • spring-beans- 3.0.5.RELEASE.jar
  • 彈簧安全網絡3.0.5.RELEASE.jar
  • 彈簧安全核心3.0.5.RELEASE.jar
  • 彈簧TX-3.0.3。 RELEASE.jar
  • aspectjrt-1.6.8.jar
  • aspectjweaver-1.6.8.jar
  • 彈簧安全配置,3.0.5.RELEASE.jar
  • 的log4j,1.2.15.jar
  • el-api-1.0.jar
  • slf4 J-API-1.5.8.jar
  • servlet的API-2.5.jar
  • JSTL-1.2.jar
  • 公地郎2.5.jar
  • RailOptIntegration-3.8.0.jar
  • 谷歌的集合-1.0.jar
  • 的junit-4.8.2.jar
  • 公地IO-2.0.1.jar
  • EL-IMPL-2.2.jar
  • javax.faces-2.1.7。罐子

一些依賴項具有「提供」範圍,並且不包含在戰爭中(只要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> 

其他依賴性在父項目中找到:

  • PC-API-2.2.0-GA.jar
  • PC的控制器-2.2.0-GA.jar
  • PC的portlet-2.2.0-GA.jar
  • PC-MC-2.2.0-GA.jar
  • WCI-WCI-2.1.1-GA.jar
  • WCI-tomcat7-2.1.1-GA.jar

當我調試 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。爲什麼這個類不能從?

我感謝您的幫助!

回答

1

我必須承認,我不知道GateIn的確切版本是用於解決此問題的,但無論如何,我可以通過簡單地保留(有意)portlet來重現GateIn-3.2.0.Final-tomcat7中的這個問題-api-2.0.jar在我的war文件的WEB-INF/lib目錄中。通過簡單地從我的web應用的WEB-INF/lib目錄中除去portlet的API-2.0.jar(或定義爲提供了Maven的這種依賴性)

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) 

我可以修復它:那我能得到這樣的事情。發生這種情況的原因很簡單,因爲jar文件已經在tomcat/lib中,因此Portlet容器引用已從Tomcat的公共ClassLoader加載的類javax.portlet.filter.PortletFilter,並且您的Filter實現了類javax.portlet.filter。 PortletFilter已從Web應用程序的ClassLoader(從WEB-INF/lib)中加載,即使這兩個類的FQN相同,它們也不會被認爲是相同的類,這就是expectedClass.isAssignableFrom(clazz)返回false。