简体   繁体   English

将Jersey客户端1.x升级到2.x时,UriBuilder上的AbstractMethodError

[英]AbstractMethodError on UriBuilder when upgrading Jersey client 1.x to 2.x

We're in the process to upgrade our Web application (running on Tomcat7) from Jersey 1.7 to Jersey 2.4.1. 我们正在将我们的Web应用程序(在Tomcat7上运行)从Jersey 1.7升级到Jersey 2.4.1。 I managed to have the server-side working now, but the JUnit tests which are using jersey-client are throwing the AbstractMethodError: java.lang.AbstractMethodError: 我设法让服务器端正在运行,但是使用jersey-client的JUnit测试抛出了AbstractMethodError:java.lang.AbstractMethodError:

javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;
    at javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.java:119)
    at org.glassfish.jersey.client.JerseyWebTarget.<init>(JerseyWebTarget.java:72)
    at org.glassfish.jersey.client.JerseyClient.target(JerseyClient.java:180)
    at org.glassfish.jersey.client.JerseyClient.target(JerseyClient.java:69)
    at ******.test.resources.ResourceConfig.getResourceWithCredentialsAt(ResourceConfig.java:144)
    at ******.test.resources.ResourceConfig.getResourceAsUserAt(ResourceConfig.java:99)
    at ******.test.resources.UsersResourceTest.testGetAuthorizedUser(UsersResourceTest.java:251)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

The project is maintained by maven, here are the pom's dependencies: 该项目由maven维护,这里是pom的依赖项:

<!-- Our webapps are tomcat servlets -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>

        <!-- Jersey Container to allow jersey running inside tomcat servlet -->
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>${jersey.version}</version>
        </dependency>

        <!-- Jersey core dependencies -->
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-server</artifactId>
            <version>${jersey.version}</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.bundles</groupId>
            <artifactId>jaxrs-ri</artifactId>
            <version>${jersey.version}</version>
        </dependency>

        <!-- Media stuff -->
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-multipart</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>${jersey.version}</version>
        </dependency>

        <!-- Jackson JSON handling -->
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>${jackson.version}</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-xml-provider</artifactId>
            <version>${jackson.version}</version>
        </dependency>

Apparently I miss a concrete implementation of the UriBuilder class, but I have no clue what dependency I need to add for this. 显然我错过了UriBuilder类的具体实现,但我不知道我需要为此添加什么依赖项。 Also -- it works for the server-side, wut!? 此外 - 它适用于服务器端,但是!?

I've found that the enunciate library depends somehow on jersey 1.1.7. 我发现enunciate库在某种程度上取决于球衣1.1.7。 This caused parts of my code to compile fine while it was still depending on 1.1.7 API's. 这导致我的代码的一部分编译正常,但仍依赖于1.1.7 API。

I found it by doing a find: 我通过查找找到了它:

find . -name *.pom -exec grep -Hn jersey {} \;

...in the ~/.m2 folder on jersey. ...在球衣上的〜/ .m2文件夹中。 This can only be done if your app is the only one using maven on your machine. 只有当您的应用是您机器上唯一使用maven的应用时,才能执行此操作。

When you see this error, it means UriBuilder is being loaded from other libraries like cxf-2.1.3.jar. 当您看到此错误时,表示正在从其他库(如cxf-2.1.3.jar)加载UriBuilder。 Just rename it to z-cxf-2.1.3.jar. 只需将其重命名为z-cxf-2.1.3.jar即可。 It should work fine.In maven find which dependency is bring the jar and use something like this 它应该工作正常。在maven中找到哪个依赖项带来jar并使用这样的东西

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>app</artifactId>
    <version>${project.version}</version>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM