2017-08-03 24 views
8

Sau khi nâng cấp dịch vụ JAX-RS được xây dựng với CXF3.x từ weblogic 12.1.3 đến 12.2.1 Tôi đang gặp vấn đề lạ sauKhông thể triển khai dịch vụ JAX-RS CXF3.x trong Weblogic 12c (12.2.1)

<03-ago-2017, 3:22:38,789 PM CEST> <Error> <HTTP> <BEA-101216> <Servlet: "JAX-RS/Jersey#1" failed to preload on startup in Web application: "sife". 
A MultiException has 1 exceptions. They are: 
1. java.lang.LinkageError: ClassCastException: attempting to castzip:C:/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_user/sife/845176/war/WEB-INF/lib/javax.ws.rs-api-2.0.1.jar!/javax/ws/rs/ext/RuntimeDelegate.class to jar:file:/C:/Oracle/Middleware/Oracle_Home/oracle_common/modules/javax.ws.rs.javax.ws.rs-api.jar!/javax/ws/rs/ext/RuntimeDelegate.class 

     at org.jvnet.hk2.internal.Utilities.justCreate(Utilities.java:1007) 
     at org.jvnet.hk2.internal.ServiceLocatorImpl.create(ServiceLocatorImpl.java:962) 
     at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:1054) 
     at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:1046) 
     at org.glassfish.jersey.model.internal.CommonConfig.configureFeatures(CommonConfig.java:696) 
     Truncated. see log file for complete stacktrace 

Lưu ý rằng tôi đang sử dụng CXF, không phải Jersey, nhưng có vẻ như Weblogic đang cố gắng sử dụng nó (nó không xảy ra với 12.1.3). Tôi bị vô hiệu hóa nó trong các tập tin cấu hình sau khuyến nghị này: https://jerometambo.github.io/blog/2016/12/13/How-to-use-CXF-3x-implementation-of-JAX-RS-20-REST-with-Weblogic-12c.html

Với cấu hình mặc định, WebLogic muốn sử dụng thực hiện nội bộ của mình (JAX-RS 2.0 và serialization) để triển khai các dịch vụ REST web (Lỗi 500):

META-INF/WebLogic-application.xml

<weblogic-application xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-application" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-application 
              http://xmlns.oracle.com/weblogic/weblogic-application/1.8/weblogic-application.xsd"> 

    <prefer-application-packages> 
     <package-name>javax.ws.rs.*</package-name> 
     <package-name>com.fasterxml.jackson.*</package-name> 
     <package-name>weblogic.jaxrs.api.client.*</package-name> 
     <package-name>weblogic.jaxrs.internal.api.*</package-name> 
     <package-name>weblogic.jaxrs.dispatch.*</package-name> 
     <package-name>weblogic.jaxrs.monitoring.util.*</package-name> 
    </prefer-application-packages> 
</weblogic-application> 

WEB-INF/weblogic.xml

<weblogic-web-app 
    xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd"> 

    <container-descriptor> 
     <prefer-application-packages> 
      <package-name>javax.ws.rs.*</package-name> 
      <package-name>com.fasterxml.jackson.*</package-name> 
     </prefer-application-packages> 
    </container-descriptor> 
</weblogic-web-app> 

Tôi không biết nếu điều này là một vấn đề cụ thể của dự án của tôi hoặc nó là một vấn đề WebLogic. Tôi đã tìm thấy các sự cố tương tự như thisthis và tôi đã cố gắng sử dụng chúng.

Đây là những phụ thuộc của tôi (IVY cú pháp)

<dependency org="org.apache.cxf" name="cxf-rt-frontend-jaxrs" rev="3.1.10" conf="default" /> 
    <dependency org="org.apache.cxf" name="cxf-rt-rs-extension-providers" rev="3.1.10" conf="default" /> 
    <dependency org="org.apache.cxf" name="cxf-rt-transports-http" rev="3.1.10" conf="default" /> 
    <dependency org="com.fasterxml.jackson.jaxrs" name="jackson-jaxrs-json-provider" rev="2.6.6" conf="default" /> 

Và stack trace đầy đủ

<03-ago-2017, 3:32:03,645 PM CEST> <Warning> <JAXRSIntegration> <BEA-2192510> <Cannot add Jersey servlet for application class org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet$ApplicationImpl because ApplicationPath annotation is not set on it.> 
<03-ago-2017, 3:32:03,737 PM CEST> <Warning> <JAXRSIntegration> <BEA-2192511> <The list of resource packages: com.fasterxml.jackson.jaxrs.base;org.apache.cxf.jaxrs.provider;com.fasterxml.jackson.jaxrs.json;org.apache.cxf.jaxrs.provider.aegis;es.aragon.sife.server.filter;org.apache.cxf.jaxrs.provider.jsrjsonp;es.aragon.sife.keystore.api;es.aragon.sife.server.account.api;org.apache.cxf.jaxrs.provider.xmlbeans;org.apache.cxf.jaxrs.validation;es.aragon.sife.server.task.api;org.apache.cxf.jaxrs.provider.json;org.apache.cxf.jaxrs.provider.atom;es.aragon.sife.server.config.api> 
ago 03, 2017 3:32:16 PM es.gob.afirma.signers.xml.Utils installXmlDSigProvider 
<03-ago-2017, 3:32:20,581 PM CEST> <Error> <HTTP> <BEA-101216> <Servlet: "JAX-RS/Jersey#1" failed to preload on startup in Web application: "sife". 
A MultiException has 1 exceptions. They are: 
1. java.lang.LinkageError: ClassCastException: attempting to castzip:C:/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_user/sife/845176/war/WEB-INF/lib/javax.ws.rs-api-2.0.1.jar!/javax/ws/rs/ext/RuntimeDelegate.class to jar:file:/C:/Oracle/Middleware/Oracle_Home/oracle_common/modules/javax.ws.rs.javax.ws.rs-api.jar!/javax/ws/rs/ext/RuntimeDelegate.class 

     at org.jvnet.hk2.internal.Utilities.justCreate(Utilities.java:1007) 
     at org.jvnet.hk2.internal.ServiceLocatorImpl.create(ServiceLocatorImpl.java:962) 
     at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:1054) 
     at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:1046) 
     at org.glassfish.jersey.model.internal.CommonConfig.configureFeatures(CommonConfig.java:696) 
     Truncated. see log file for complete stacktrace 
Caused By: java.lang.LinkageError: ClassCastException: attempting to castzip:C:/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_user/sife/845176/war/WEB-INF/lib/javax.ws.rs-api-2.0.1.jar!/javax/ws/rs/ext/RuntimeDelegate.class to jar:file:/C:/Oracle/Middleware/Oracle_Home/oracle_common/modules/javax.ws.rs.javax.ws.rs-api.jar!/javax/ws/rs/ext/RuntimeDelegate.class 
     at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:146) 
     at javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:120) 
     at javax.ws.rs.core.MediaType.valueOf(MediaType.java:179) 
     at org.glassfish.jersey.media.sse.SseFeature.<clinit>(SseFeature.java:62) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     Truncated. see log file for complete stacktrace 
> 
<03-ago-2017, 3:32:20,696 PM CEST> <Error> <Deployer> <BEA-149231> <Unable to set the activation state to true for the application "sife". 
weblogic.application.ModuleException: java.lang.LinkageError: ClassCastException: attempting to castzip:C:/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_user/sife/845176/war/WEB-INF/lib/javax.ws.rs-api-2.0.1.jar!/javax/ws/rs/ext/RuntimeDelegate.class to jar:file:/C:/Oracle/Middleware/Oracle_Home/oracle_common/modules/javax.ws.rs.javax.ws.rs-api.jar!/javax/ws/rs/ext/RuntimeDelegate.class 
     at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:140) 
     at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124) 
     at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:233) 
     at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:228) 
     at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:45) 
     Truncated. see log file for complete stacktrace 
Caused By: java.lang.LinkageError: ClassCastException: attempting to castzip:C:/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_user/sife/845176/war/WEB-INF/lib/javax.ws.rs-api-2.0.1.jar!/javax/ws/rs/ext/RuntimeDelegate.class to jar:file:/C:/Oracle/Middleware/Oracle_Home/oracle_common/modules/javax.ws.rs.javax.ws.rs-api.jar!/javax/ws/rs/ext/RuntimeDelegate.class 
     at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:146) 
     at javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:120) 
     at javax.ws.rs.core.MediaType.valueOf(MediaType.java:179) 
     at org.glassfish.jersey.media.sse.SseFeature.<clinit>(SseFeature.java:62) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     Truncated. see log file for complete stacktrace 
> 
<03-ago-2017, 3:32:20,762 PM CEST> <Notice> <Log Management> <BEA-170027> <The server has successfully established a connection with the Domain level Diagnostic Service.> 
<03-ago-2017, 3:32:20,931 PM CEST> <Notice> <WebLogicServer> <BEA-000365> <Server state changed to ADMIN.> 
<03-ago-2017, 3:32:21,46 PM CEST> <Notice> <WebLogicServer> <BEA-000365> <Server state changed to RESUMING.> 
<03-ago-2017, 3:32:21,174 PM CEST> <Notice> <WebLogicServer> <BEA-000360> <The server started in RUNNING mode.> 
<03-ago-2017, 3:32:21,186 PM CEST> <Notice> <WebLogicServer> <BEA-000365> <Server state changed to RUNNING.> 
<03-ago-2017, 3:32:22,710 PM CEST> <Error> <HTTP> <BEA-101216> <Servlet: "weblogic.management.rest.Application" failed to preload on startup in Web application: "wls-management-services.war". 
A MultiException has 1 exceptions. They are: 
1. java.lang.NoClassDefFoundError: Could not initialize class org.glassfish.jersey.media.sse.SseFeature 

     at org.jvnet.hk2.internal.Utilities.justCreate(Utilities.java:1007) 
     at org.jvnet.hk2.internal.ServiceLocatorImpl.create(ServiceLocatorImpl.java:962) 
     at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:1054) 
     at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:1046) 
     at org.glassfish.jersey.model.internal.CommonConfig.configureFeatures(CommonConfig.java:696) 
     Truncated. see log file for complete stacktrace 
Caused By: java.lang.NoClassDefFoundError: Could not initialize class org.glassfish.jersey.media.sse.SseFeature 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
     at org.glassfish.hk2.utilities.reflection.ReflectionHelper.makeMe(ReflectionHelper.java:1350) 
     Truncated. see log file for complete stacktrace 
> 
<03-ago-2017, 3:32:22,747 PM CEST> <Error> <J2EE> <BEA-160001> <Error deploying Internal Application: weblogic.application.ModuleException: java.lang.NoClassDefFoundError: Could not initialize class org.glassfish.jersey.media.sse.SseFeature 
weblogic.application.utils.StateChangeException: weblogic.application.ModuleException: java.lang.NoClassDefFoundError: Could not initialize class org.glassfish.jersey.media.sse.SseFeature 
     at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:58) 
     at weblogic.application.services.BackgroundDeploymentManagerService$BackgroundDeployAction.run(BackgroundDeploymentManagerService.java:396) 
     at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:666) 
     at weblogic.invocation.ComponentInvocationContextManager._runAs(ComponentInvocationContextManager.java:348) 
     at weblogic.invocation.ComponentInvocationContextManager.runAs(ComponentInvocationContextManager.java:333) 
     Truncated. see log file for complete stacktrace 
Caused By: weblogic.application.ModuleException: java.lang.NoClassDefFoundError: Could not initialize class org.glassfish.jersey.media.sse.SseFeature 
     at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:140) 
     at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124) 
     at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:233) 
     at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:228) 
     at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:45) 
     Truncated. see log file for complete stacktrace 
Caused By: java.lang.NoClassDefFoundError: Could not initialize class org.glassfish.jersey.media.sse.SseFeature 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
     at org.glassfish.hk2.utilities.reflection.ReflectionHelper.makeMe(ReflectionHelper.java:1350) 
     Truncated. see log file for complete stacktrace 

CÁCH GIẢI QUYẾT

Nó hoạt động nếu tôi triển khai mô-đun CXF trước khác bằng cách sử dụng triển khai JAX-RS mặc định và xóa WEB-INF/lib/javax.ws.rs-api-2.0.1.jar. Có thể weblogic làm một số loại khởi tạo nội bộ.

myapp.ear 
    init.war (JAX-RS with CXF and removing javax.ws.rs-api-2.0.1.jar) 
    myapp.war (JAX-RS with CXF and weblogic configuration) 

Trả lời

1

@pedrofb, điều này có thể không trả lời đầy đủ câu hỏi của bạn, tuy nhiên, tôi từng gặp vấn đề tương tự với Tomcat. Các triệu chứng tương tự nhau, vấn đề không thực sự do sự hiện diện của các lớp khác nhau trong các lọ khác nhau, tức là đổ bóng. Đó là do shadowloader classloader. Trong Tomcat, việc nạp lớp thực sự bị đảo ngược, không phải kiểu mô hình 'ask-your-parent-classloader-first' thông thường, nếu một trình nạp lớp ứng dụng có thể tìm thấy một lớp (nơi nó chỉ tải từ WEB-INF/lib hoặc các lớp), sau đó classloader tải lớp. Bây giờ, trong trường hợp của bạn, tôi nghĩ, vì các lọ JAX-RS hiện diện trong WEB-INF/lib của bạn, nó đang được nạp từ đó ở cấp ứng dụng web. Tuy nhiên, khi cùng một đối tượng đang được truyền vào thùng chứa, nó đang cố gắng đưa nó vào cùng một lớp nhưng ở mức vùng chứa được nạp bởi một trình nạp lớp khác nhau. Các lớp được nạp bởi các trình nạp lớp khác nhau được xem là khác nhau; đây sẽ là nguyên nhân cho ClassCastException.

Điều này cũng sẽ giải thích tại sao không có ClassCastException khi bạn loại bỏ bình JAX-RS khỏi WEB-INF/lib. Cách giải quyết ở đây bị hạn chế, hoặc bạn loại bỏ bình JAX-RS khỏi WEb-INF/lib của bạn như bạn đã làm. (Điều này có thể có khả năng có vấn đề nhưng bạn có thể thử nghiệm trong máy chủ không sản xuất), thay thế bình chứa JAX-RS của container bằng một cái mà bạn muốn.

Như tôi đã nói, điều này có thể sẽ không giải quyết được vấn đề của bạn hoàn toàn nhưng có thể chỉ theo hướng mà vấn đề phát sinh. [Như tôi đã nhận thấy một số năm trở lại, Weblogic sử dụng tomcat như lõi container web của nó (không chắc chắn nếu nó vẫn là như nhau) với các tên gói đã thay đổi như com.bea.weblogic.org.apache.tomcat ...].

Hy vọng điều này sẽ hữu ích.

+0

Cảm ơn câu trả lời của bạn. Tôi tin rằng nó là một vấn đề bộ nạp lớp của * wls 12.2.1 * vì trong * wls 12.1.3 * và trong * tomcat * nó hoạt động hoàn hảo. Tôi đã cố gắng để thay thế wls JAX-RS .jar với tôi nhưng tôi đã không có may mắn – pedrofb

Các vấn đề liên quan