使用 CXF JAX-RS 的 Liferay 7.1 自定义 portlet

Liferay 7.1 custom portlet using CXF JAX-RS

我的包试图启动时出现以下错误:

The activate method has thrown an exception
java.lang.NoClassDefFoundError: Could not initialize class javax.ws.rs.core.EntityTag

当我尝试部署 OSGi 模块时发生这种情况。

我正在使用:

编辑 1 完整堆栈跟踪

java.lang.ExceptionInInitializerError
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.cxf.common.util.ProxyHelper.canSeeAllInterfaces(ProxyHelper.java:112)
at org.apache.cxf.common.util.ProxyHelper.getClassLoaderForInterfaces(ProxyHelper.java:61)
at org.apache.cxf.common.util.ProxyHelper.getProxyInternal(ProxyHelper.java:48)
at org.apache.cxf.common.util.ProxyHelper.getProxy(ProxyHelper.java:126)
at org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean.createWithValues(JAXRSClientFactoryBean.java:323)
at org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean.create(JAXRSClientFactoryBean.java:264)
at org.apache.cxf.jaxrs.client.JAXRSClientFactory.create(JAXRSClientFactory.java:172)
at org.apache.cxf.jaxrs.client.JAXRSClientFactory.create(JAXRSClientFactory.java:126)
at com.mycompany.myservice.service.impl.MyServiceImpl.activate(MyServiceImpl.java:161)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.felix.scr.impl.inject.methods.BaseMethod.invokeMethod(BaseMethod.java:228)
at org.apache.felix.scr.impl.inject.methods.BaseMethod.access0(BaseMethod.java:41)
at org.apache.felix.scr.impl.inject.methods.BaseMethod$Resolved.invoke(BaseMethod.java:664)
at org.apache.felix.scr.impl.inject.methods.BaseMethod.invoke(BaseMethod.java:510)
at org.apache.felix.scr.impl.inject.methods.ActivateMethod.invoke(ActivateMethod.java:317)
at org.apache.felix.scr.impl.inject.methods.ActivateMethod.invoke(ActivateMethod.java:307)
at org.apache.felix.scr.impl.manager.SingleComponentManager.createImplementationObject(SingleComponentManager.java:341)
at org.apache.felix.scr.impl.manager.SingleComponentManager.createComponent(SingleComponentManager.java:114)
at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:983)
at org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:956)
at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:901)
at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.run(ServiceFactoryUse.java:212)
at java.security.AccessController.doPrivileged(Native Method)
at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.factoryGetService(ServiceFactoryUse.java:210)
at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.getService(ServiceFactoryUse.java:111)
at org.eclipse.osgi.internal.serviceregistry.ServiceConsumer.getService(ServiceConsumer.java:45)
at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:524)
at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.getService(ServiceRegistry.java:464)
at org.eclipse.osgi.internal.framework.BundleContextImpl.getService(BundleContextImpl.java:624)
at org.apache.felix.scr.impl.manager.SingleRefPair.getServiceObject(SingleRefPair.java:73)
at org.apache.felix.scr.impl.inject.BindParameters.getServiceObject(BindParameters.java:47)
at org.apache.felix.scr.impl.inject.field.FieldHandler$ReferenceMethodImpl.getServiceObject(FieldHandler.java:519)
at org.apache.felix.scr.impl.manager.DependencyManager.getServiceObject(DependencyManager.java:2308)
at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.prebind(DependencyManager.java:1162)
at org.apache.felix.scr.impl.manager.DependencyManager.prebind(DependencyManager.java:1576)
at org.apache.felix.scr.impl.manager.AbstractComponentManager.collectDependencies(AbstractComponentManager.java:1029)
at org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:936)
at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:756)
at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.addedService(DependencyManager.java:1053)
at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.addedService(DependencyManager.java:1007)
at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1216)
at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1137)
at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.trackAdding(ServiceTracker.java:944)
at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.track(ServiceTracker.java:880)
at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:1168)
at org.apache.felix.scr.impl.BundleComponentActivator$ListenerInfo.serviceChanged(BundleComponentActivator.java:125)
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.apache.felix.scr.impl.manager.AbstractComponentManager.register(AbstractComponentManager.java:906)
at org.apache.felix.scr.impl.manager.AbstractComponentManager.register(AbstractComponentManager.java:892)
at org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:128)
at org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:959)
at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:732)
at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.addedService(DependencyManager.java:1053)
at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.addedService(DependencyManager.java:1007)
at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1216)
at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1137)
at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.trackAdding(ServiceTracker.java:944)
at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.track(ServiceTracker.java:880)
at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:1168)
at org.apache.felix.scr.impl.BundleComponentActivator$ListenerInfo.serviceChanged(BundleComponentActivator.java:125)
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.apache.felix.scr.impl.manager.AbstractComponentManager.register(AbstractComponentManager.java:906)
at org.apache.felix.scr.impl.manager.AbstractComponentManager.register(AbstractComponentManager.java:892)
at org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:128)
at org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:959)
at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:732)
at org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:666)
at org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:432)
at org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:665)
at org.apache.felix.scr.impl.BundleComponentActivator.initialEnable(BundleComponentActivator.java:339)
at org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:381)
at org.apache.felix.scr.impl.Activator.access0(Activator.java:49)
at org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:263)
at org.apache.felix.scr.impl.AbstractExtender.createExtension(AbstractExtender.java:196)
at org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:169)
at org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:49)
at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:488)
at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:1)
at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:232)
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.start(Module.java:467)
at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1682)
at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1662)
at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1624)
at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1555)
at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1)
at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException
at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:64)
at javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:48)
at javax.ws.rs.core.EntityTag.<clinit>(EntityTag.java:28)
... 111 more 
Caused by: java.lang.ClassNotFoundException
at javax.ws.rs.ext.RuntimeDelegateFinder.newInstance(RuntimeDelegateFinder.java:118)
at javax.ws.rs.ext.RuntimeDelegateFinder.find(RuntimeDelegateFinder.java:94)
at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:58)
... 113 more 
Caused by: java.lang.InstantiationException
at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:48)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at javax.ws.rs.ext.RuntimeDelegateFinder.newInstance(RuntimeDelegateFinder.java:114)

请注意,JAX RS RuntimeDelegate 的默认实现是 org.apache.cxf.jaxrs.impl.RuntimeDelegateImpl

编辑 2

WARN  [main][AriesJaxrsServiceRuntime:246] Extension CachingServiceReference {_cachedProperties={osgi.jaxrs.application.select=(osgi.jaxrs.name=Liferay.OAuth2.Application), service.id=3972, objectClass=[javax.ws.rs.ext.MessageBodyWriter], osgi.jaxrs.name=OAuthAuthorizationDataMessageBodyWriter, osgi.jaxrs.extension.select=null (cached), service.ranking=null (cached), osgi.jaxrs.whiteboard.target=null (cached)}_serviceReference={javax.ws.rs.ext.MessageBodyWriter}={service.id=3972, osgi.jaxrs.extension=true, service.bundleid=660, service.scope=bundle, osgi.jaxrs.application.select=(osgi.jaxrs.name=Liferay.OAuth2.Application), osgi.jaxrs.name=OAuthAuthorizationDataMessageBodyWriter, component.name=com.liferay.oauth2.provider.rest.internal.endpoint.authorize.OAuthAuthorizationDataMessageBodyWriter, component.id=2290}_} is registered with error [Sanitized]
ERROR [main][Whiteboard:80] ServiceReference CachingServiceReference {_cachedProperties={osgi.jaxrs.application.select=(osgi.jaxrs.name=Liferay.OAuth2.Application), service.id=3972, objectClass=[javax.ws.rs.ext.MessageBodyWriter], osgi.jaxrs.name=OAuthAuthorizationDataMessageBodyWriter, osgi.jaxrs.extension.select=null (cached), service.ranking=null (cached), osgi.jaxrs.whiteboard.target=null (cached)}_serviceReference={javax.ws.rs.ext.MessageBodyWriter}={service.id=3972, osgi.jaxrs.extension=true, service.bundleid=660, service.scope=bundle, osgi.jaxrs.application.select=(osgi.jaxrs.name=Liferay.OAuth2.Application), osgi.jaxrs.name=OAuthAuthorizationDataMessageBodyWriter, component.name=com.liferay.oauth2.provider.rest.internal.endpoint.authorize.OAuthAuthorizationDataMessageBodyWriter, component.id=2290}_} for extension produced error: java.lang.IllegalArgumentException: interface org.apache.cxf.jaxrs.ext.MessageContext is not visible from class loader [Sanitized]
WARN  [main][AriesJaxrsServiceRuntime:246] Extension CachingServiceReference {_cachedProperties={osgi.jaxrs.application.select=(osgi.jaxrs.name=Liferay.OAuth2.Application), service.id=3973, objectClass=[javax.ws.rs.ext.MessageBodyWriter], osgi.jaxrs.name=OAuthErrorMessageBodyWriter, osgi.jaxrs.extension.select=null (cached), service.ranking=null (cached), osgi.jaxrs.whiteboard.target=null (cached)}_serviceReference={javax.ws.rs.ext.MessageBodyWriter}={service.id=3973, osgi.jaxrs.extension=true, service.bundleid=660, service.scope=bundle, osgi.jaxrs.application.select=(osgi.jaxrs.name=Liferay.OAuth2.Application), osgi.jaxrs.name=OAuthErrorMessageBodyWriter, component.name=com.liferay.oauth2.provider.rest.internal.endpoint.authorize.OAuthErrorMessageBodyWriter, component.id=2291}_} is registered with error [Sanitized]
ERROR [main][Whiteboard:80] ServiceReference CachingServiceReference {_cachedProperties={osgi.jaxrs.application.select=(osgi.jaxrs.name=Liferay.OAuth2.Application), service.id=3973, objectClass=[javax.ws.rs.ext.MessageBodyWriter], osgi.jaxrs.name=OAuthErrorMessageBodyWriter, osgi.jaxrs.extension.select=null (cached), service.ranking=null (cached), osgi.jaxrs.whiteboard.target=null (cached)}_serviceReference={javax.ws.rs.ext.MessageBodyWriter}={service.id=3973, osgi.jaxrs.extension=true, service.bundleid=660, service.scope=bundle, osgi.jaxrs.application.select=(osgi.jaxrs.name=Liferay.OAuth2.Application), osgi.jaxrs.name=OAuthErrorMessageBodyWriter, component.name=com.liferay.oauth2.provider.rest.internal.endpoint.authorize.OAuthErrorMessageBodyWriter, component.id=2291}_} for extension produced error: java.lang.IllegalArgumentException: interface org.apache.cxf.jaxrs.ext.MessageContext is not visible from class loader [Sanitized]
WARN  [main][AriesJaxrsServiceRuntime:246] Extension CachingServiceReference {_cachedProperties={osgi.jaxrs.application.select=null (cached), service.id=1287, objectClass=[javax.ws.rs.ext.MessageBodyReader, javax.ws.rs.ext.MessageBodyWriter], osgi.jaxrs.name=jaxb-json, osgi.jaxrs.extension.select=null (cached), service.ranking=-2147483648, osgi.jaxrs.whiteboard.target=null (cached)}_serviceReference={javax.ws.rs.ext.MessageBodyReader, javax.ws.rs.ext.MessageBodyWriter}={service.id=1287, osgi.jaxrs.extension=true, service.bundleid=551, service.scope=prototype, service.ranking=-2147483648, osgi.jaxrs.name=jaxb-json}_} is registered with error [Sanitized]
ERROR [main][Whiteboard:80] ServiceReference CachingServiceReference {_cachedProperties={osgi.jaxrs.application.select=null (cached), service.id=1287, objectClass=[javax.ws.rs.ext.MessageBodyReader, javax.ws.rs.ext.MessageBodyWriter], osgi.jaxrs.name=jaxb-json, osgi.jaxrs.extension.select=null (cached), service.ranking=-2147483648, osgi.jaxrs.whiteboard.target=null (cached)}_serviceReference={javax.ws.rs.ext.MessageBodyReader, javax.ws.rs.ext.MessageBodyWriter}={service.id=1287, osgi.jaxrs.extension=true, service.bundleid=551, service.scope=prototype, service.ranking=-2147483648, osgi.jaxrs.name=jaxb-json}_} for extension produced error: java.lang.IllegalArgumentException: interface org.apache.cxf.jaxrs.ext.MessageContext is not visible from class loader [Sanitized]
WARN  [main][AriesJaxrsServiceRuntime:246] Extension CachingServiceReference {_cachedProperties={osgi.jaxrs.application.select=null (cached), service.id=1287, objectClass=[javax.ws.rs.ext.MessageBodyReader, javax.ws.rs.ext.MessageBodyWriter], osgi.jaxrs.name=jaxb-json, osgi.jaxrs.extension.select=null (cached), service.ranking=-2147483648, osgi.jaxrs.whiteboard.target=null (cached)}_serviceReference={javax.ws.rs.ext.MessageBodyReader, javax.ws.rs.ext.MessageBodyWriter}={service.id=1287, osgi.jaxrs.extension=true, service.bundleid=551, service.scope=prototype, service.ranking=-2147483648, osgi.jaxrs.name=jaxb-json}_} is registered with error [Sanitized]
ERROR [main][Whiteboard:80] ServiceReference CachingServiceReference {_cachedProperties={osgi.jaxrs.application.select=null (cached), service.id=1287, objectClass=[javax.ws.rs.ext.MessageBodyReader, javax.ws.rs.ext.MessageBodyWriter], osgi.jaxrs.name=jaxb-json, osgi.jaxrs.extension.select=null (cached), service.ranking=-2147483648, osgi.jaxrs.whiteboard.target=null (cached)}_serviceReference={javax.ws.rs.ext.MessageBodyReader, javax.ws.rs.ext.MessageBodyWriter}={service.id=1287, osgi.jaxrs.extension=true, service.bundleid=551, service.scope=prototype, service.ranking=-2147483648, osgi.jaxrs.name=jaxb-json}_} for extension produced error: java.lang.IllegalArgumentException: interface org.apache.cxf.jaxrs.ext.MessageContext is not visible from class loader [Sanitized]

我仍然不明白为什么 OSGi 容器会抛出该错误,但解决方法是通过在相关 OSGI 模块中添加以下内容来尝试推迟模块初始化:

 @Reference(target = ModuleServiceLifecycle.PORTAL_INITIALIZED, unbind = "-") 
protected void setModuleServiceLifecycle(ModuleServiceLifecycle moduleServiceLifecycle) { }

这对我来说效果很好。希望对您有所帮助!