2012-05-21 3 views
0

Tomcat 6에서 wep 응용 프로그램을 Tomcat의 현재 버전 (7-27)으로 업데이트하기 시작했습니다. I는 시동 할 때 서버를 다음과 같은 오류 메시지와 함께 문제가 발생합니다 :LifeCycle 오류 - 올바른 인터페이스를 구현하지 않았습니다. javax.portlet.filter.PortletFilter

ERROR 라이프 사이클 - 객체에게 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) 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) at org.gatein.pc.portlet.impl.container.PortletApplicationLifeCycle.startDependents (PortletApplicationLifeCycle.java:339) at org.gatein.pc.portlet.impl. org.gatein.pc.mc.PortletApplicationDeployer.add (PortletApplicationDeployer.java에서 org.gatein.pc.mc.PortletApplicationDeployment.install (PortletApplicationDeployment.java:153) 에서 container.LifeCycle.managedStart (LifeCycle.java:129) : 216) at org.gatein.pc. impl.DefaultServletContainer.fireEvent (DefaultServletContainer.java:219) at org.gatein. wci.impl.DefaultServletContainer.access $ 400 (DefaultServletContainer.java:60) at org.gatein.wci.impl.DefaultServletContainer $ RegistrationImpl.registerWebApp (DefaultServletContainer.java:338) at org.gatein.wci.tomcat.TC7ServletContainerContext.start 조직에서 org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent (LifecycleSupport.java:119) 에서 org.gatein.wci.tomcat.TC7ServletContainerContext.lifecycleEvent (TC7ServletContainerContext.java:234)에서 (TC7ServletContainerContext.java:380) .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. innerRun (FutureTask.java:303) at java.util.concurrent.FutureTask.run (FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:886) at java. (Thread.java:619) A : S : R : U : 오류 LifeCycle - 개체를 시작할 수 없습니다. org. gatein.pc.portlet.container.PortletInitializationException : 예상 인터페이스를 구현하지 않기 때문에 com.qnamic.railopt.web.core.portal.ContextFilter 클래스로 필터를 만들 수 없습니다. org.gatein.pc.portlet.impl.jsr168.PortletFilterImpl.start에서 org.gatein.pc.portlet.impl.jsr168.ClassInstanceLifeCycle.create (ClassInstanceLifeCycle.java:85) 에서 javax.portlet.filter.PortletFilter (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.mc.PortletApplicationDeployment.install (PortletApplicationDeployment.java:153) at org.gatein.pc.mc.PortletApplicationDeployer.add (PortletApplicationDeployer.java:216) org.gatein.pc.mc.PortletApplicationDeployer.onEvent (PortletApplicationDeployer.java:185)에서 org.gatein.wci.impl.DefaultServletContainer에서 . org.gatein.wci.impl.DefaultServletContainer.access $ 400 (DefaultServletContainer.java:60)에서 org.gatein.wci.impl.DefaultServletContainer.fireEvent (DefaultServletContainer.java:219) 에서 safeFireEvent (DefaultServletContainer.java:200) org.gatein.wci.impl.DefaultServletContainer $ RegistrationImpl.registerWebApp (DefaultServ letContainer.java:338) 조직에서 org.gatein.wci.tomcat.TC7ServletContainerContext.lifecycleEvent (TC7ServletContainerContext.java:234) 에서 org.gatein.wci.tomcat.TC7ServletContainerContext.start (TC7ServletContainerContext.java:380) 에서 . org.apache.catalina.util.LifecycleBase.setStateInternal에서 org.apache.catalina.util.LifecycleBase.fireLifecycleEvent (LifecycleBase.java:90) 에서 apache.catalina.util.LifecycleSupport.fireLifecycleEvent (LifecycleSupport.java:119) (org.apache.catalina.core.ContainerBase $ StartChild.call (ContainerBase.java:1566) 에서에서 org.apache.catalina.util.LifecycleBase.start (LifecycleBase.java:168) 에서 LifecycleBase.java:401) org.apache.catalina.core.ContainerBase $ StartChild.call (ContainerBase.java:1556) at java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:303) at java.util.concurrent.FutureTask.run (FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor $ Worker. java.lang.Thread.run에서 java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:908) 에서 runTask (ThreadPoolExecutor.java:886) (Thread.java:619)

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 : 클래스 com.qnamic.railopt.web.security.portlet.PortletSecurityFilter는 인터페이스 javax.portlet.filter.PortletFilter를 구현하지

  • primefaces-3.2.jar
  • 스프링 코어 3.0.5.RELEASE.jar
  • 스프링 ASM : LTER는 종속 항아리는 javax.portlet.filter.PortletFilter

    을 구현하지 -3.0.5.RELEASE.jar

  • 스프링 상황 3.0.5.RELEASE.jar
  • 스프링 AOP-3.0.5.RELEASE.jar
  • 스프링 발현 3.0.5.RELEASE.jar,853,210
  • 스프링 webmvc-포틀릿 3.0.5.RELEASE.jar
  • 스프링 webmvc-3.0.5.RELEASE.jar
  • 스프링 컨텍스트 지원-3.0.5.RELEASE.jar
  • 포틀릿 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
  • 봄 - 콩 - 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
  • 서블릿 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
  • 엘 IMPL-2.2.jar
  • javax.faces-2.1.7. 병

일부 종속성에는 "제공됨"이라는 범위가 있으며 전쟁에 포함되지 않습니다 (톰캣이 사용하지 않는 한)! 다른 종속성 부모 프로젝트에서 발견되는

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

내 portlet.xml의의

부 :

  • PC-API-2.2.0-GA.jar
  • PC 컨트롤러 -2.2.0-GA.jar
  • PC-포틀릿-2.2.0-GA.jar
  • PC-MC-2.2.0-GA.jar
  • 0 1,232,WCI-WCI-2.1.1-GA.jar
  • WCI-tomcat7-2.1.1-GA.jar

나는 org.gatein.pc.portlet.impl.jsr168의 코드를 디버깅 할 때 .ClassInstanceLifeCycle.create (...첫 번째 줄이 제대로 클래스 PortletSecurityFilter를로드하기 때문에) 는,

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); 
} 

나의 제안이 클래스 로더에 문제가 있지만하지 않을 것을 첫 번째 두 번째 줄에 중단됩니다. 예상되는 클래스는 예상대로 javax.portlet.filter.PortletFilter입니다. 왜 수업을 양도 할 수 없습니까?

도움에 감사드립니다.

답변

1

이 문제를 해결하는 데 사용한 GateIn의 정확한 버전이 무엇인지 잘 모르겠지만, 어쨌든 (의도적으로) 포틀릿을 유지함으로써 GateIn-3.2.0.Final-tomcat7에서이 문제를 재현 할 수 있습니다. 내 war 파일의 WEB-INF/lib 디렉토리에있는 -api-2.0.jar. 단순히 내 웹 애플리케이션의 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) 

내가 그것을 고칠 수 : 나는 다음과 같은 무언가를 얻을 수 있습니다. 이것은 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를 반환합니다.

관련 문제