将应用程序从RestEasy迁移到Jersey

时间:2016-09-26 19:23:37

标签: java maven jersey cdi resteasy

我正在努力将应用程序从RestEasy实现迁移到Jersey实现。我面临的主要问题是CDI部件所需的罐子 使用resteasy时,我们使用以下3个与resteasy相关的罐子

<dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-cdi</artifactId>
        <version>3.0.8-FINAL</version>
</dependency>
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jaxrs</artifactId>
    <version>3.0.8-FINAL</version>
</dependency>
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-servlet-initializer</artifactId>
    <version>3.0.8-FINAL</version>
</dependency>

现在,为了将它迁移到泽西岛,我使用以下罐子代替了重新装罐。

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.22.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.ext.cdi</groupId>
    <artifactId>jersey-cdi1x-servlet</artifactId>
    <version>2.22.1</version>
</dependency>
<dependency>
    <groupId>javax.enterprise</groupId>
    <artifactId>cdi-api</artifactId>
    <version>1.1</version>
</dependency>

现在,当我尝试在JBOSS服务器上部署EAR时,出现以下错误。

15:04:48,156 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-5) MSC000001: Failed to start service jboss.deployment.subunit."abc-ear.ear"."xyz-service-impl.war".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.subunit."abc-ear.ear"."xyz-service-impl.war".POST_MODULE: JBAS018733: Failed to process phase POST_MODULE of subdeployment "xyz-service-impl.war" of deployment "abc-ear.ear"
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:166) [jboss-as-server-7.4.0.Final-redhat-19.jar:7.4.0.Final-redhat-19]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1980) [jboss-msc-1.1.5.Final-redhat-1.jar:1.1.5.Final-redhat-1]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1913) [jboss-msc-1.1.5.Final-redhat-1.jar:1.1.5.Final-redhat-1]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_45]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_45]
at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_45]
Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS016053: Service class org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider didn't implement the javax.enterprise.inject.spi.Extension interface
at org.jboss.as.weld.deployment.WeldPortableExtensions.tryRegisterExtension(WeldPortableExtensions.java:48)
at org.jboss.as.weld.deployment.processors.WeldPortableExtensionProcessor.loadAttachments(WeldPortableExtensionProcessor.java:119)
at org.jboss.as.weld.deployment.processors.WeldPortableExtensionProcessor.deploy(WeldPortableExtensionProcessor.java:79)
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:159) [jboss-as-server-7.4.0.Final-redhat-19.jar:7.4.0.Final-redhat-19]
... 5 more

从堆栈跟踪中可以看出,我得到的错误是org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider didn't implement the javax.enterprise.inject.spi.Extension interface

我下载了所需jar的源代码,以查看有问题的类是否实现了该接口。好吧,它确实实现了Extension接口。

目前我无法找到解决此错误的方法 我尝试了各种不同的球衣罐的排列和组合,但无法找到解决方法。
我已经没想完了。任何帮助都会非常感激。

3 个答案:

答案 0 :(得分:1)

最近我做了类似的迁移(RESTEasy 3.0.8.Final - &gt; Jersey 2.23.1),但我的迁移还包括放弃WildFly服务器。所以它有很大的不同。

您尚未提供有关旧焊接版本的任何信息,因此请在此处执行此操作。

无论如何,在您更新问题之前,我会提出两个提示:

  • 您的错误很可能是由EAR部署引起的。因为CDI和EAR档案有时不能很好地融合在一起。如果您将包装更改为* .war?
  • ,您能检查一下会发生什么吗?
  • 如果您还没有非常非常的理由在仍使用Java EE应用服务器和CDI时迁移到非内置JAX-RS实现,请不要这样做它。这是一项艰巨的任务。

聚苯乙烯。 JFYI我遇到的Weld和App服务器的问题让我尽可能地抛弃它们。

<强>更新

你说你正在使用Weld 1.1.23.FINAL - 这是非常重要的信息。自泽西岛2.15以来泽西+韦尔德的整合发生了巨大变化就个人而言,如果没有更新的焊接版本(在我的情况下为2.3.5),我无法使其工作 - 可能是因为不支持这种组合。 在你的情况下,当你使用极其旧的焊接版本时,我会建议你尝试最多的泽西2.14。

在泽西岛2.14中,所需的依赖性是不同的。请删除jersey-cdi1x-servlet并尝试此操作:

<dependency>
  <groupId>org.glassfish.jersey.containers.glassfish</groupId>
  <artifactId>jersey-gf-cdi</artifactId>
  <version>2.14</version>
</dependency>
<dependency>
  <groupId>org.glassfish.jersey.containers.glassfish</groupId>
  <artifactId>jersey-gf-cdi-ban-custom-hk2-binding</artifactId>
  <version>2.14</version>
</dependency>

<!-- is it needed for you?
<dependency>
  <groupId>org.jboss.weld.servlet</groupId>
  <artifactId>weld-servlet-core</artifactId>
</dependency>
-->

BTW:我可以知道你为什么要在JBoss中更改JAX-RS实现吗?

答案 1 :(得分:0)

我上个月已迁移到最新版本,这对我有用。 试试这个。

<properties>
    <version.jersey>2.23.2</version.jersey>
    <version.glassfish>2.4.0</version.glassfish>
</properties>

<dependencies>
    <dependency>
        <groupId>org.glassfish.hk2.external</groupId>
        <artifactId>asm-all-repackaged</artifactId>
        <version>${version.glassfish}</version>
    </dependency>

    <dependency>
        <artifactId>hk2-utils</artifactId>
        <groupId>org.glassfish.hk2</groupId>
        <version>${version.glassfish}</version>
        <exclusions>
            <exclusion>
                <artifactId>javax.inject</artifactId>
                <groupId>javax.inject</groupId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>javax.annotation</groupId>
        <artifactId>javax.annotation-api</artifactId>
        <version>1.2</version>
    </dependency>

    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.0.1</version>
    </dependency>

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.2.12</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-common</artifactId>
        <version>${version.jersey}</version>
        <exclusions>
            <exclusion>
                <groupId>org.glassfish.hk2</groupId>
                <artifactId>osgi-resource-locator</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.glassfish.hk2.external</groupId>
                <artifactId>aopalliance-repackaged</artifactId>
            </exclusion>                            
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>${version.jersey}</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
        <version>${version.jersey}</version>
    </dependency>
</dependencies>

答案 2 :(得分:-1)

您可能使用了错误的依赖关系。检查一下: https://jersey.java.net/documentation/latest/modules-and-dependencies.html