gpt4 book ai didi

java - 运行测试时出现 java.lang.InknownClassChangeError

转载 作者:行者123 更新时间:2023-12-02 10:15:04 24 4
gpt4 key购买 nike

出现错误

java.lang.IncompatibleClassChangeError: class org.glassfish.jersey.server.internal.scanning.AnnotationAcceptingListener$AnnotatedClassVisitor can not implement org.objectweb.asm.ClassVisitor, because it is not an interface (org.objectweb.asm.ClassVisitor is in unnamed module of loader '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";
}
}
}

最佳答案

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

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

11 September 2011: ASM 4.0 RC2 (tag ASM_4_0_RC2) ClassVisitor, MethodVisitor, etc interfaces replaced with abstract classes, in order to ensure backward binary compatibility in future ASM versions.

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

(通常,根据特定类对另一个类的依赖关系,将报告 IncompleteClassChange 错误,其中初始依赖类期望另一个依赖类的特定特征。例如,依赖类当依赖类是一个接口(interface)时可能已编译,但依赖类的实现已更改为具体类。针对依赖类的初始版本进行的依赖类加载工作正常。依赖类的加载针对依赖类的更新版本的类失败并出现异常。)

关于java - 运行测试时出现 java.lang.InknownClassChangeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54749281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com