my first post on SO and expecting good stuff in return :-)
I have developed a small java restful services app and integrated with Swagger. I have @Controller -> @Service -> @Repository architecture. I have deployed on Glassfish (4.1.1), when I use Chrome's 'Advanced Rest Client', I am able to perfectly send and receive rest calls (GET/POST etc), but when I use Swagger, it throws the following exception 'after Controller returns the correct response'.
I have been struggling with this by changing the maven entry versions, changing the moxy jar, delting felix as suggested in some forums etc, none seem to help.
Here are more details ...
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>
swagger entry in the 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>
Appreciate if anyone can tell me what exactly is the issue ... its been a frustrating week & am stuck with this, not making any progress.
The stack trace mentions: java.lang.ClassNotFoundException: com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector not found by com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider
and you are excluding the JAXB annotation module:
<exclusion>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
</exclusion>
The exclusion means a dependency is not resolved, and therefore you'll get the ClassNotFoundException
This worked for me:
Steps: 1-Stop domain
2-Remove content of this folder: Glassfish\glassfish\domains\DOMAIN_NAME\osgi-cache\felix
3-In this folder: C:\Glassfish\glassfish\modules Substitute jackson libraries by the 2.4.4 version:
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-Start domain
I hope it helps :-)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With