問題
- Liferay DXP プロジェクトに RESTeasy JAX RS 依存関係を統合しているときに、サーバー ログに以下のメッセージが表示される場合があります。
SEVERE [fileinstall-/home/liferay.com/7.0/osgi/war] org.apache.catalina.core.ApplicationContext.log Patterns, regex or servletNames must contain a value.
または:
java.lang.IllegalArgumentException: Patterns, regex or servletNames must contain a value.
at org.eclipse.equinox.http.servlet.internal.context.ContextController.doAddFilterRegistration(ContextController.java:245)
[...]
SEVERE [fileinstall-/liferay-portal-7.2.10-ga1/osgi/war] org.apache.catalina.core.ApplicationContext.log Invalid pattern '' java.lang.IllegalArgumentException: Invalid pattern '' at org.eclipse.equinox.http.servlet.internal.context.ContextController.checkPattern(ContextController.java:987) at org.eclipse.equinox.http.servlet.internal.context.ContextController.doAddFilterRegistration(ContextController.java:244) at org.eclipse.equinox.http.servlet.internal.context.ContextController.addFilterRegistration(ContextController.java:179) at org.eclipse.equinox.http.servlet.internal.customizer.ContextFilterTrackerCustomizer.addingService(ContextFilterTrackerCustomizer.java:55) at org.eclipse.equinox.http.servlet.internal.customizer.ContextFilterTrackerCustomizer.addingService(ContextFilterTrackerCustomizer.java:1) at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:943) at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:1) at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256) at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229) at org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:903) at org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:109) at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:891) at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:804) at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:127) at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:228) at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:469) at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:487) at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:1004) at com.liferay.portal.osgi.web.wab.extender.internal.WabBundleProcessor.initFilters(WabBundleProcessor.java:525) at com.liferay.portal.osgi.web.wab.extender.internal.WabBundleProcessor.init(WabBundleProcessor.java:220) at com.liferay.portal.osgi.web.wab.extender.internal.WebBundleDeployer._initWabBundle(WebBundleDeployer.java:179) at com.liferay.portal.osgi.web.wab.extender.internal.WebBundleDeployer.doStart(WebBundleDeployer.java:101) at com.liferay.portal.osgi.web.wab.extender.internal.WabFactory$WABExtension.start(WabFactory.java:114) at com.liferay.portal.osgi.web.wab.extender.internal.WabFactory.addingBundle(WabFactory.java:67) at com.liferay.portal.osgi.web.wab.extender.internal.WabFactory.addingBundle(WabFactory.java:49) at org.osgi.util.tracker.BundleTracker$Tracked.customizerAdding(BundleTracker.java:475) at org.osgi.util.tracker.BundleTracker$Tracked.customizerAdding(BundleTracker.java:1) at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256) at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229) at org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:450) at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:908) at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148) at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:230) at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:137) at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:129) at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:191) at org.eclipse.osgi.container.Module.publishEvent(Module.java:476) at org.eclipse.osgi.container.Module.doStart(Module.java:578) at org.eclipse.osgi.container.Module.start(Module.java:449) at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:428) at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1264) at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1237) at org.apache.felix.fileinstall.internal.DirectoryWatcher.doProcess(DirectoryWatcher.java:520) at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:365) at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:316)
メッセージにもかかわらず、ポートレットはシームレスに動作します。
Environment
- Liferay DXP 7.0+
解決策
- ロギング メッセージを処理するために考えられる 1 つの方法は、
Filter30Dispatcherクラスをオーバーライドして、RESTEasyで動作するカスタム フィルターを開発することです。
追加情報
- これらのケースでは、フィルタ宣言が仕様を満たしていないため、Liferay はポータル側でそれを回避できません。これは、フィルタを受け入れる/コードを維持するためのコードの変更が OSGI および/または Tomcat 固有のトピックであるためです。
1. Java Servlet Specification、特に第 8 章を見ると、注釈に関する多くの情報が表示されます。
2.Web アプリケーションでは、アノテーションを使用するクラスは、それらが WEB-INF/classes ディレクトリにある場合、またはアプリケーション内の WEB-INF/lib にある jar ファイルにパッケージ化されている場合にのみ、アノテーションが処理されます。
WEB-INF/lib内には、resteasy-jaxrs.jarがあります。 これは、処理されてエラーをスローしているjarです
3. jar の中には、Filter30Dispatcher.classというファイルがあります。 このクラスには、次の注釈があります。
@WebFilter(
4. 仕様のセクション 8.1.2 から:
asyncSupported = true
)
この注釈は、Web アプリケーションでフィルターを定義するために使用されます。 この注釈はクラスで指定され、宣言されているフィルターに関するメタデータを含みます。 指定されていない場合のフィルタのデフォルト名は、完全修飾クラス名です。 注釈の urlPatterns 属性、servletNames 属性、または value 属性を指定する必要があります。
urlPatterns、servletNames、値はFilter30DispatcherのWebFilterアノテーション内で指定する必要があります。
さらに、Tomcat の ContextConfig.java クラスを調べると、Tomcat 、これらの値がすべて欠落している場合、フィルターを処理しません。 代わりに、単にそれを無視して先に進みます。 これは、これが Liferay のバグではなく、フィルターの指定方法に問題があるという結論を裏付けています。