java - Swagger 阅读器抛出 java.lang.NoSuchMethodError

标签 java jackson swagger

我正在尝试在我的项目 (Sparkjava) 中创建 API 文档。 [我用这篇文章][1] 我写了这个解析器:

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.jaxrs.Reader;
import io.swagger.models.*;
import spark.Route;

import java.util.Arrays;
import java.util.List;

public class SwaggerParser {

    public static String getSwaggerJson(List<Route> routes) throws JsonProcessingException {
        Swagger swagger = getSwagger(routes);
        return swaggerToJson(swagger);
    }

    private static Swagger getSwagger(List<Route> routes) {
        Swagger swagger = new Swagger();
        swagger.info(new Info().description("User API")
                .version("V1.0")
                .title("Some random api for testing")
                .contact(new Contact().name("Serol").url("https://serol.ro")));
        swagger.schemes(Arrays.asList(Scheme.HTTP, Scheme.HTTPS));
        swagger.consumes("application/json");
        swagger.produces("application/json");
        swagger.tag(new Tag().name("swagger"));

        Reader reader = new Reader(swagger);

        for (Route route : routes) {
            try {
                reader.read(route.getClass());
            }catch (Throwable throwable){
                System.out.println(throwable);
            }
        }

        return reader.getSwagger();
    }

    public static String swaggerToJson(Swagger swagger) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(Include.NON_EMPTY);
        return objectMapper.writeValueAsString(swagger);
    }

}

它在我的测试应用程序中有效,但在实际项目中无效。我为此编写了初始化测试:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.healthgorilla.portal.server.labnetwork.api.GetOrdersAPI;
import com.healthgorilla.portal.server.labnetwork.route.GetOrdersRoute;
import org.junit.Test;

import java.util.Collections;

import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class SwaggerParserTest {
    @Test
    public void name() throws JsonProcessingException {
        GetOrdersAPI api = mock(GetOrdersAPI.class);
        when(api.exec()).thenReturn("");

        String swaggerJson = SwaggerParser.getSwaggerJson(Collections.singletonList(new GetOrdersRoute(api)));
        
        assertNotNull(swaggerJson);
    }
}

它抛出一个异常:

java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.introspect.AnnotatedMember.getType(Lcom/fasterxml/jackson/databind/type/TypeBindings;)Lcom/fasterxml/jackson/databind/JavaType;

但在测试项目中它有效 [1]: https://serol.ro/posts/2016/swagger_sparkjava/

编辑:

我发现了冲突。它在项目中更新了 jckson 版本。我改变了我的 Swagger 依赖

<!-- swagger -->
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-core</artifactId>
            <version>1.6.2</version>
            <exclusions>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-databind</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-annotations</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-jaxrs</artifactId>
            <version>1.6.2</version>
            <exclusions>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-databind</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-annotations</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

但这并没有帮助。有我的 jackson 依赖项:

<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.11.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.11.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.11.2</version>
        </dependency>

最佳答案

可能的问题是您的依赖项(包括传递性)与您的 swagger 版本不兼容。 我不知道您使用的是哪个构建系统,但在 Maven 中可以使用

mvn dependency:tree

https://maven.apache.org/plugins/maven-dependency-plugin/tree-mojo.html

在 gradle 中,您可以尝试 gradle -q dependencies --configuration scm,更多信息请参见 https://docs.gradle.org/current/userguide/viewing_debugging_dependencies.html

尝试检查您的依赖项及其版本。

关于java - Swagger 阅读器抛出 java.lang.NoSuchMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65998704/

相关文章:

java - 查找和数组中的最大值

java - 如何查看 java 序列化对象?

java - 使用 Java (Jackson) 读取 JSON 中嵌套键的值

java - 以两种不同的方式序列化 jackson 场

java - Jackson 在将抽象类型映射到具体类型时放弃类型绑定(bind)

spring-boot - 带有不记名 token 的 Spring Boot swagger ui

java - 使用另一个 java 类更新 ResultSet

java - Selenium Internet Explorer 单击按钮

spring-boot - Swagger-UI 在根端点上不显示 SpringBoot 和路径参数

即使包存在,也找不到 Python 包