运行测试时获取java.lang.IncompatibleClassChangeError

问题描述 投票:0回答:1

得到错误

java.lang.IncompatibleClassChangeError:class org.glassfish.jersey.server.internal.scanning.AnnotationAcceptingListener $ AnnotatedClassVisitor无法实现org.objectweb.asm.ClassVisitor,因为它不是一个接口(org.objectweb.asm.ClassVisitor是未命名的装载程序'app'的模块)

package com.configuration;

import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;

import static org.junit.Assert.assertEquals;

import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.container.*;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Response;
import java.io.IOException;

public class EndpointLoggingListenerTest extends JerseyTest {

    private static final String APPLICATION_NAME = "EndpointApplication";
    private static EndpointLoggingListener applicationEventListener;

    @Override
    protected Application configure() {
        applicationEventListener = new EndpointLoggingListener("abc");
        final ResourceConfig resourceConfig = new ResourceConfig(MyResource.class);
        resourceConfig.register(applicationEventListener);
        resourceConfig.register(RequestFilter.class);
        resourceConfig.register(PreMatchingRequestFilter.class);
        resourceConfig.register(ResponseFilter.class);
        // resourceConfig.register(MyExceptionMapper.class);
        resourceConfig.setApplicationName(APPLICATION_NAME);
        return resourceConfig;
    }

    @Test
    public void testMatchedMethod() {
        final Response response = target().path("resource").request().get();
        assertEquals(200, response.getStatus());
        assertEquals("get", response.readEntity(String.class));
    }


    public static class RequestFilter implements ContainerRequestFilter {

        @Override
        public void filter(ContainerRequestContext requestContext) throws IOException {
        }
    }

    @PreMatching
    public static class PreMatchingRequestFilter implements ContainerRequestFilter {

        @Override
        public void filter(ContainerRequestContext requestContext) throws IOException {
        }
    }


    public static class ResponseFilter implements ContainerResponseFilter {

        @Override
        public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        }
    }

    @Path("resource")
    public static class MyResource {

        @GET
        public String getMethod() {
            return "get";
        }

        @POST
        public void post(String entity) {
        }

        @Path("locator")
        public SubResource locator() {
            return new SubResource();
        }
    }


    public static class SubResource {
        @GET
        public String get() {
            return "sub";
        }
    }
}
java jersey-2.0 jersey-test-framework
1个回答
0
投票

Net,AnnotationAcceptingListener类是使用ClassVisitor的一个版本实现的,但是ClassVisitor的一个新实现提供了与Listener实现不兼容的更改。

这是因为ASM在引入4.0版时更改了ClassVisitor实现。在4.0版之前,ClassVisitor被实现为接口。从4.0版开始,ClassVisitor成为一个抽象类。请参阅:https://asm.ow2.io/versions.html,特别是本文:

2011年9月11日:ASM 4.0 RC2(标记ASM_4_0_RC2)将ClassVisitor,MethodVisitor等接口替换为抽象类,以确保在将来的ASM版本中实现向后二进制兼容性。

要么,您需要链接到早期版本的ASM jar,或者您需要一个与新ASM API兼容的AnnotationAcceptingListener的新实现。

(通常,将根据特定类对另一个类的依赖性来报告IncompatibleClassChange错误,其中初始的依赖类期望另一个类的依赖性类的特定特征。例如,依赖类可能已经在依赖类是一个接口时进行编译,但依赖类的实现被改为一个具体的类。依赖类的初始版本对依赖类的加载工作正常。依赖类的加载对更新版本的依赖项类失败,但有异常。)

© www.soinside.com 2019 - 2024. All rights reserved.