部署期间出现jersey 2.0错误的Weblogc 12.2.1.3

Cub*_*ube 5 java-7 weblogic12c jersey-2.0 hk2

当前,我们使用以下框架开发了jersey 2.0 restful应用程序:

  • 贾克斯里(2.25.1)
  • 弹簧4(4.3.10)
  • 球衣-spring3(2.25.1)

该应用程序可在tomcat 8.5Weblogic 12.1.x服务器上完美运行

但是,当我们尝试将其部署到 Weblogic 12.2.1.3

<Oct 6, 2017 10:32:23,020 AM HKT> <Error> <Deployer> <BEA-149265> <Failure occurred in the execution of deployment request with ID "214569275552728" for task "1" on [partition-name: DOMAIN]. Error is: "weblogic.application.ModuleException: org.glassfish.jersey.internal.ServiceConfigurationError: org.glassfish.jersey.server.spi.ComponentProvider: The class org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider implementing the provider interface org.glassfish.jersey.server.spi.ComponentProvider is not found. The provider implementation is ignored."
weblogic.application.ModuleException: org.glassfish.jersey.internal.ServiceConfigurationError: org.glassfish.jersey.server.spi.ComponentProvider: The class org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider implementing the provider interface org.glassfish.jersey.server.spi.ComponentProvider is not found. The provider implementation is ignored.
        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: org.glassfish.jersey.internal.ServiceConfigurationError: org.glassfish.jersey.server.spi.ComponentProvider: The class org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider implementing the provider interface org.glassfish.jersey.server.spi.ComponentProvider is not found. The provider implementation is ignored.
        at org.glassfish.jersey.internal.ServiceFinder.fail(ServiceFinder.java:433)
        at org.glassfish.jersey.internal.ServiceFinder.access$300(ServiceFinder.java:155)
        at org.glassfish.jersey.internal.ServiceFinder$LazyObjectIterator.handleClassNotFoundException(ServiceFinder.java:806)
        at org.glassfish.jersey.internal.ServiceFinder$LazyObjectIterator.hasNext(ServiceFinder.java:757)
        at org.glassfish.jersey.server.ApplicationHandler.getRankedComponentProviders(ApplicationHandler.java:743)
        Truncated. see log file for complete stacktrace
>
Run Code Online (Sandbox Code Playgroud)

由于我们不使用任何CDI实现(使用了HK2和Spring的DI),因此我们尝试在WEB-INFO文件夹下添加beans.xml,并让服务器不扫描我们的应用程序。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       bean-discovery-mode="none" >
</beans>
Run Code Online (Sandbox Code Playgroud)

并且我们还尝试在Weblogic中禁用隐式Bean发现

所有尝试仍然无法解决该错误。请帮助。

更新1

我们尝试services在META-INF下创建一个空文件夹(不知道为什么需要它,任何人都可以解释一下),然后在weblogic.xml中添加以下内容

<prefer-application-resources>
    <resource-name>META-INF/services/javax.servlet.ServletContainerInitializer</resource-name>
    <resource-name>META-INF/services/javax.ws.rs.ext.RuntimeDelegate</resource-name>

    <!-- jersey  -->
    <resource-name>META-INF/services/org.glassfish.jersey.*</resource-name>
    <resource-name>org.glassfish.jersey.*</resource-name>
    <resource-name>jersey.repackaged.*</resource-name>

    <!-- hk2 -->
    <resource-name>META-INF/services/org.glassfish.hk2.*</resource-name>
</prefer-application-resources>
Run Code Online (Sandbox Code Playgroud)

现在,应用程序可以使用自己的jersey 2.25.1库而不是Weblogic 12.2预先构建的库(2.21.x)正常运行。但是,还会出现另一个警告消息,不确定是否是问题。

<BEA-2192510> <Cannot add Jersey servlet for application class org.glassfish.jersey.server.ResourceConfig because ApplicationPath annotation is not set on it.>
Run Code Online (Sandbox Code Playgroud)

@ApplicationPath已经设置

@ApplicationPath("/api")
public class MyResourceConfig extends ResourceConfig {
    public MyResourceConfig() {

        register(JacksonFeature.class);
        ...

    }
}
Run Code Online (Sandbox Code Playgroud)