【问题标题】:com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector not found --- while using Swaggercom.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector not found --- 使用 Swagger
【发布时间】:2016-06-03 00:04:53
【问题描述】:

我在 SO 上的第一篇文章并期待有好的回报:-)

我开发了一个小型 Java RESTful 服务应用程序并与 Swagger 集成。我有 @Controller -> @Service -> @Repository 架构。我已经部署在 Glassfish(4.1.1)上,当我使用 Chrome 的“高级休息客户端”时,我能够完美地发送和接收休息调用(GET/POST 等),但是当我使用 Swagger 时,它会抛出以下异常'控制器返回正确响应后'。

我一直在通过更改 maven 条目版本、更改 moxy jar、按照某些论坛中的建议删除 felix 等来解决这个问题,但似乎没有任何帮助。

这里有更多细节......

例外:

  StandardWrapperValve[com.xxx.config.ApplicationConfig]: Servlet.service() for servlet com.xxx.config.ApplicationConfig threw exception
java.lang.ClassNotFoundException: com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector not found by com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider [130]
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532)
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

代码:

@Controller
@Path("/document")
@Api(value = "/document", description = "Document Controller ")
public class DocumentController {

    @Inject
    DocumentService documentService;

    @GET
    @Path("/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "Get Document.", notes = "Get Document Call")
    @ApiResponses(value = { @ApiResponse(code = 200, message = "OK"),
            @ApiResponse(code = 500, message = "Something wrong in Server") })
    public DtoDocument getDocument(@PathParam("id") Integer docId) {
        Document doc = documentService.getDocument(docId);
        DtoDocument dto = toDto(doc);
        return dto;
    }
}

@Service
@Transactional
public class DocumentService {

    @Inject
    DocumentRepository repository;

    public Document getDocument(Integer id) {
        return repository.getDocumentById(id);
    }

}

@Repository
public class DocumentRepository {

    public static final String COLLECTION_NAME = "document";

    @Inject
    private MongoTemplate mongoTemplate;

    public Document getDocumentById(Integer Id) {
        Document doc = getMongoTemplate().findOne(Query.query(Criteria.where("id").is(Id)), Document.class, COLLECTION_NAME);
        return doc;
    }

}

@ApplicationPath("/rest")
public class ApplicationConfig extends Application {

    @Override
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new java.util.HashSet();

        resources.add(com.wordnik.swagger.jaxrs.listing.ApiListingResource.class);
        resources.add(com.wordnik.swagger.jaxrs.listing.ApiDeclarationProvider.class);
        resources.add(com.wordnik.swagger.jaxrs.listing.ApiListingResourceJSON.class);
        resources.add(com.wordnik.swagger.jaxrs.listing.ResourceListingProvider.class);

        addRestResourceClasses(resources);

        return resources;
    }

    private void addRestResourceClasses(Set<Class<?>> resources) {
        // Custom resources in the project (all restful services)
        resources.add(com.xxx.web.rest.DocumentController.class);
    }

}

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
    bean-discovery-mode="all">
</beans>

pom.xml 中的招摇条目

<dependency>
            <groupId>com.wordnik</groupId>
            <artifactId>swagger-jersey-jaxrs_2.10</artifactId>
            <version>1.3.13</version>
            <exclusions>
                <exclusion>
                    <groupId>com.sun.jersey.contribs</groupId>
                    <artifactId>jersey-spring</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jersey</groupId>
                    <artifactId>jersey-client</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jersey</groupId>
                    <artifactId>jersey-server</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jersey</groupId>
                    <artifactId>jersey-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jersey</groupId>
                    <artifactId>jersey-servlet</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jersey</groupId>
                    <artifactId>jersey-multipart</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.codehaus.jackson</groupId>
                    <artifactId>jackson-mapper-asl</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.google.guava</groupId>
                    <artifactId>guava</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.fasterxml.jackson.module</groupId>
                    <artifactId>jackson-module-jaxb-annotations</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

如果有人能告诉我到底是什么问题,不胜感激......这是令人沮丧的一周,我一直坚持这一周,没有取得任何进展。

【问题讨论】:

    标签: java maven swagger glassfish-4.1


    【解决方案1】:

    堆栈跟踪提到:java.lang.ClassNotFoundException: com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector not found by com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider

    并且您正在排除 JAXB 注释模块:

    <exclusion>
       <groupId>com.fasterxml.jackson.module</groupId>
       <artifactId>jackson-module-jaxb-annotations</artifactId>
    </exclusion>
    

    排除意味着依赖项未解决,因此您将获得ClassNotFoundException

    【讨论】:

    • 我实际上已经尝试不排除并在 glassfish/modules 目录下添加 jackson-module-jaxb-annotations-2.7.1.jar。两者都不起作用。
    • 对我来说,最大的问题是:为什么同样适用于另一个休息客户端而不是 Swagger,这让我认为 Swagger 有自己的路线,我以某种方式绕过 glassfish 类路径..机会 ?我的意思是它可能有自己的 jackson-module-jaxb-annotations 仍然覆盖 glassfish jar 文件...
    【解决方案2】:

    我不知道这是否也适用于 4.1.1,但 Glassfish 4.1 是随旧的 Jackson 版本一起提供的,这就是你上面提到的问题的原因。

    要解决它,您必须强制 Glassfish 至少加载 Jackson 2.4.5,这是 swagger-core 的最低要求。 Upgrading Jackson in GlassFish 4.1 涵盖了这个过程。

    【讨论】:

    • 感谢您的评论.. 但是,我尝试将 jar 文件放在模块目录中,清理 felix 和反弹 GF,但问题仍然存在。我什至修改了“asadmin”以使用最新的 jar 文件传递​​类路径,它仍然用 Swagger 内部使用的旧版本覆盖类路径。我试过这样...
    • export RUNTIME_CLASSPATH="/Users/xxx/Software/glassfish4/glassfish/modules/jackson-module-jaxb-annotations-2.7.1.jar" export RUNTIME_CLASSPATH="$RUNTIME_CLASSPATH:/Users/xxx /Software/glassfish4/glassfish/modules/jackson-core-2.7.1.jar" export RUNTIME_CLASSPATH="$RUNTIME_CLASSPATH:$CLASSPATH" exec "$JAVA" -cp RUNTIME_CLASSPATH -jar "$AS_INSTALL_LIB/client/appserver-cli.jar " "$@"
    • 我怕不知道怎么逼GF接个版本。有没有办法可以验证加载了哪个版本的 Jackson?您收到的错误强烈表明它是错误的版本(Jackson 的旧版本大多向后兼容)。
    • Ron,事实上它在我上面提到的更改类路径后起作用了。
    • 它也适用于 4.1.1。我通过用 org.eclipse.persistence.moxy-2.7.0.jar 替换随附的 jar 解决了这个问题
    【解决方案3】:

    这对我有用:

    步骤: 1-停止域

    2-删除此文件夹的内容:Glassfish\glassfish\domains\DOMAIN_NAME\osgi-cache\felix

    3-在此文件夹中:C:\Glassfish\glassfish\modules 用 2.4.4 版本替换 jackson 库:

    jackson-module-jaxb-annotations-2.4.4

    jackson-jaxrs-json-provider-2.4.4

    jackson-jaxrs-base-2.4.4

    jackson-databind-2.4.4

    jackson-annotations-2.4.4

    jackson-core-2.4.4

    4-起始域

    希望对你有帮助:-)

    【讨论】:

      【解决方案4】:

      添加 2 个依赖项 - 它对我有用

         <dependency>
              <groupId>com.fasterxml.jackson.module</groupId>
              <artifactId>jackson-module-jaxb-annotations</artifactId>
              <version>2.10.1</version>
          </dependency>
      
      
          <dependency>
              <groupId>com.fasterxml.jackson.core</groupId>
              <artifactId>jackson-databind</artifactId>
              <exclusions>
                  <exclusion>
                      <groupId>com.fasterxml.jackson.module</groupId>
                      <artifactId>jackson-module-jaxb-annotations</artifactId>
                  </exclusion>
              </exclusions>
          </dependency>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-22
        • 1970-01-01
        • 2022-08-19
        • 2018-10-26
        • 1970-01-01
        • 2021-12-27
        • 1970-01-01
        • 2015-10-16
        相关资源
        最近更新 更多