Tomcat 6 から現在のバージョンの Tomcat (7-27) への wep アプリケーションの更新を開始しました。サーバーを起動すると、次のエラー メッセージが表示されて問題が発生します。
エラー LifeCycle - オブジェクト org.gatein.pc.portlet.container.PortletInitializationException を開始できません: クラス com.qnamic.railopt.web.security.portlet.PortletSecurityFilter でフィルターを作成できません。これは、予期されるインターフェイス javax.portlet.filter を実装していないためです。 org.gatein.pc.portlet.impl.jsr168 の PortletFilter.ClassInstanceLifeCycle.create(ClassInstanceLifeCycle.java:85) org.gatein.pc.portlet.impl.jsr168.PortletFilterImpl.start(PortletFilterImpl.java:144) gatein.pc.portlet.impl.container.PortletFilterLifeCycle.invokeStart(PortletFilterLifeCycle.java:66) org.gatein.pc.portlet.impl.container.LifeCycle.managedStart(LifeCycle.java:93) org.gatein.pc. org.gatein.pc.portlet.impl.container.LifeCycle の portlet.impl.container.PortletApplicationLifeCycle.startDependents(PortletApplicationLifeCycle.java:339)。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 org.gatein.wci.tomcat の .tomcat.TC7ServletContainerContext.start(TC7ServletContainerContext.java:380)。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) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) で java. java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) で util.concurrent.FutureTask.run(FutureTask.java:138)、java.util.concurrent で。ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) A: S: R: U: エラー LifeCycle - オブジェクト org.gatein.pc.portlet.container を開始できません.PortletInitializationException: クラス com.qnamic.railopt.web.core.portal.ContextFilter でフィルターを作成できません.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) org.gatein.pc.portlet.impl.container.LifeCycle.managedStart(LifeCycle.java:93) で org.gatein.pc.portlet.impl.container.PortletApplicationLifeCycle で。org.gatein.pc.portlet.impl.container.LifeCycle.managedStart(LifeCycle.java:129) の startDependents(PortletApplicationLifeCycle.java:339) org.gatein.pc.mc.PortletApplicationDeployment.install(PortletApplicationDeployment.java:153) の startDependents(PortletApplicationLifeCycle.java:339) 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 org.gatein.wci の .wci.impl.DefaultServletContainer$RegistrationImpl.registerWebApp(DefaultServletContainer.java:338)。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) でjava.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) で java.util.concurrent.FutureTask.run(FutureTask.java:138) で 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 {
ActionFilter は javax.portlet.filter.PortletFilter を実装します
依存する jar は次のとおりです。
- primefaces-3.2.jar
- spring-core-3.0.5.RELEASE.jar
- spring-asm-3.0.5.RELEASE.jar
- spring-context-3.0.5.RELEASE.jar
- spring-aop-3.0.5.RELEASE.jar
- 春式-3.0.5.RELEASE.jar
- spring-webmvc-portlet-3.0.5.RELEASE.jar
- spring-webmvc-3.0.5.RELEASE.jar
- spring-context-support-3.0.5.RELEASE.jar
- portlet-api-2.0.jar
- Platform-3.8.0.jar
- jdo-2.0.jar
- kodo-runtime.jar
- openjpa-1.0-fast.jar
- PlanOpt-3.8.0.jar
- RailOptBase-3.8.0.jar
- portletfaces-bridge-api-2.0.0-RC1.jar
- portletfaces-bridge-impl-2.0.0-RC1.jar
- portletfaces-logging-1.1.0.jar
- commons-collections-3.2.1.jar
- spring-web-3.0.5.RELEASE.jar
- aopalliance-1.0.jar
- spring-beans-3.0.5.RELEASE.jar
- spring-security-web-3.0.5.RELEASE.jar
- spring-security-core-3.0.5.RELEASE.jar
- spring-tx-3.0.3.RELEASE.jar
- spectjrt-1.6.8.jar
- アスペクトjweaver-1.6.8.jar
- spring-security-config-3.0.5.RELEASE.jar
- log4j-1.2.15.jar
- el-api-1.0.jar
- slf4j-api-1.5.8.jar
- サーブレット-api-2.5.jar
- jstl-1.2.jar
- commons-lang-2.5.jar
- RailOptIntegration-3.8.0.jar
- google-collections-1.0.jar
- junit-4.8.2.jar
- commons-io-2.0.1.jar
- el-impl-2.2.jar
- javax.faces-2.1.7.jar
一部の依存関係にはスコープが「提供」されており、戦争には含まれていません (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-controller-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(...) のコードをデバッグすると、2 行目で停止します。
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 です。クラスが割り当てられないのはなぜですか?
助けてくれてありがとう!