com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector 未找到 --- 使用 Swagger 时
com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector not found --- while using Swagger
我在 SO 上的第一个 post 并期待 return 中的好东西:-)
我开发了一个小型 java restful 服务应用程序并与 Swagger 集成。我有 @Controller -> @Service -> @Repository 架构。我已经部署在 Glassfish (4.1.1) 上,当我使用 Chrome 的 'Advanced Rest Client' 时,我能够完美地发送和接收休息呼叫(GET/POST 等),但是当我使用Swagger,它抛出如下异常'after Controller returns the correct response'.
我一直在通过更改 Maven 条目版本、更改 moxy jar、删除 felix(如某些论坛中的建议等)来解决这个问题,none 似乎有所帮助。
这里有更多详细信息...
异常:
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.access0(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
中的 swagger 条目
<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.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
我不知道这是否也适用于 4.1.1,但是 Glassfish 4.1 附带了旧的 Jackson 版本,这就是您在上面提到的问题的原因。
要解决它,您必须强制 Glassfish 至少加载 Jackson 2.4.5,这是 swagger-core 的最低要求。 Upgrading Jackson in GlassFish 4.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-起始域
希望对您有所帮助:-)
添加 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>
我在 SO 上的第一个 post 并期待 return 中的好东西:-)
我开发了一个小型 java restful 服务应用程序并与 Swagger 集成。我有 @Controller -> @Service -> @Repository 架构。我已经部署在 Glassfish (4.1.1) 上,当我使用 Chrome 的 'Advanced Rest Client' 时,我能够完美地发送和接收休息呼叫(GET/POST 等),但是当我使用Swagger,它抛出如下异常'after Controller returns the correct response'.
我一直在通过更改 Maven 条目版本、更改 moxy jar、删除 felix(如某些论坛中的建议等)来解决这个问题,none 似乎有所帮助。
这里有更多详细信息...
异常:
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.access0(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
中的 swagger 条目<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.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
我不知道这是否也适用于 4.1.1,但是 Glassfish 4.1 附带了旧的 Jackson 版本,这就是您在上面提到的问题的原因。
要解决它,您必须强制 Glassfish 至少加载 Jackson 2.4.5,这是 swagger-core 的最低要求。 Upgrading Jackson in GlassFish 4.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-起始域
希望对您有所帮助:-)
添加 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>