Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector not found --- while using Swagger

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 ...

Exception:

  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)

Code:

@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.

like image 859
rtnyc Avatar asked Feb 21 '16 16:02

rtnyc


2 Answers

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

like image 174
beny23 Avatar answered Oct 16 '22 09:10

beny23


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 :-)

like image 32
Roberto Rodriguez Avatar answered Oct 16 '22 11:10

Roberto Rodriguez