Получение java.lang.IncompatibleClassChangeError при запуске теста - PullRequest
0 голосов
/ 18 февраля 2019

Получение ошибки как

java.lang.IncompatibleClassChangeError: class org.glassfish.jersey.server.internal.scanning.AnnotationAcceptingListener $ AnnotatedClassVisitor не может реализовать org.objectweb.asmitorClass, так как itlass.не является интерфейсом (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";
        }
    }
}

1 Ответ

0 голосов
/ 19 февраля 2019

Net, класс AnnotationAcceptingListener был реализован с использованием версии ClassVisitor, но в новую реализацию ClassVisitor были внесены изменения, несовместимые с реализацией Listener.

Это связано с тем, что ASM изменил реализацию ClassVisitorпри представлении версии 4.0.До версии 4.0 ClassVisitor был реализован как интерфейс.Начиная с версии 4.0, ClassVisitor стал абстрактным классом.См .: https://asm.ow2.io/versions.html, и, в частности, этот текст:

11 сентября 2011 года: интерфейсы ASM 4.0 RC2 (тег ASM_4_0_RC2) ClassVisitor, MethodVisitor и т. Д. Заменены абстрактными классами, чтобы обеспечитьобратная двоичная совместимость в будущих версиях ASM.

Либо вам нужно будет ссылаться на более раннюю версию JAR-файла ASM, либо вам потребуется новая реализация AnnotationAcceptingListener, совместимая с новойAPI ASM.

(Как правило, ошибка IncompatibleClassChange будет сообщаться на основе зависимости определенного класса от другого класса, где начальный, зависимый класс ожидает особую характеристику другого класса зависимости.Например, зависимый класс мог быть скомпилирован, в то время как зависимый класс был интерфейсом, но реализация зависимого класса была изменена, чтобы быть конкретным классом. Загрузка зависимого класса, сделанная против начальной версии класса зависимости, работает отлично. ГрузСбой зависимого класса в обновленной версии класса зависимостей за исключением.)

...