获取错误
java.lang.IncompatibleClassChangeError:类 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";
}
}
}
答案 0 :(得分:0)
净,类AnnotationAcceptingListener是使用ClassVisitor的版本实现的,但是ClassVisitor的新实现已提供了与监听器实现不兼容的更改。
这是因为在引入版本4.0时,ASM更改了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错误,其中初始的依赖类期望其他依赖类的特定特征。例如,依赖类可能已经在依赖类是接口的情况下进行了编译,但是将依赖类的实现更改为具体类。对依赖类的初始版本进行依赖类的加载工作正常。类针对依赖项类的更新版本失败,并出现异常。