Dejell
Dejell

Reputation: 14337

swagger jersey REST API doesn't work

I followed the step to add Swagger to my already built Jersey REST API project in TOMCAT

  1. Added:
swagger-annotations-1.3.10.jar
swagger-core_2.10-1.3.10.jar
swagger-jaxrs_2.10-1.3.10.jar
swagger-jersey2-jaxrs_2.10-1.3.10.jar
  1. Added in web.xml

    contextClass org.springframework.web.context.support.AnnotationConfigWebApplicationContext contextConfigLocation com.estartup.config.PersistenceConfig

    <!-- Bootstrap the root application context as usual using ContextLoaderListener -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    
    <servlet>
        <servlet-name>jersey-servlet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.estartup.config.Application</param-value>
        </init-param>
    
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>jersey-servlet</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>
    
    <servlet>
        <servlet-name>Jersey2Config</servlet-name>
        <servlet-class>com.wordnik.swagger.jersey.config.JerseyJaxrsConfig</servlet-class>
        <init-param>
            <param-name>api.version</param-name>
            <param-value>1.0.0</param-value>
        </init-param>
        <init-param>
            <param-name>swagger.api.basepath</param-name>
            <param-value>http://localhost:8080/api</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
    

Application class:

public class Application extends ResourceConfig {

    @Inject
    public Application(ServiceLocator serviceLocator) {
        register(new ServiceBinder());
        register(com.estartup.feature.JacksonFeature.class);            
        packages(true, "com.estartup", "com.wordnik.swagger.jaxrs.json","com.wordnik.swagger.jersey.listing");

    }

}

However, when I navigate to

http://localhost:8080/api/api-docs I get HTTP Status 404 - page not found.

:(. In the logs I do see that swagger is being loaded like this: What is wrong?

15935 DEBUG [localhost-startStop-1] com.wordnik.swagger.jaxrs.config.WebXMLReader - set api.version to 1.0.0
15935 DEBUG [localhost-startStop-1] com.wordnik.swagger.jaxrs.config.WebXMLReader - set swagger.api.basepath to http://localhost:8080/api

Upvotes: 1

Views: 5795

Answers (2)

rafambbr
rafambbr

Reputation: 628

Try this configuration:

pom.xml:

...
<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-jersey2-jaxrs</artifactId>
    <version>1.5.0</version>
</dependency>
...

web.xml:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
    <display-name>ProjectName</display-name>

    <servlet>
        <servlet-name>jersey-servlet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>your.package.name.YourApplication</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>jersey-servlet</servlet-name>
        <url-pattern>/rs/*</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>SwaggerBootstrap</servlet-name>
        <servlet-class>your.package.name.SwaggerApplication</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>

</web-app>

SwaggerApplication.java:

public class SwaggerApplication extends HttpServlet {

    private static final long serialVersionUID = -6039834823506457822L;

    @Override
    public void init(ServletConfig config) throws ServletException {

        super.init(config);

        BeanConfig beanConfig = new BeanConfig();

        final String contextPath = config.getServletContext().getContextPath();
        final StringBuilder sbBasePath = new StringBuilder(); 
        sbBasePath.append(contextPath);
        sbBasePath.append("/rs");
        beanConfig.setBasePath(sbBasePath.toString());

        // API Info
        beanConfig.setVersion("0.1");
        beanConfig.setTitle("My Swagger APP");
        beanConfig.setResourcePackage("your.package.name");
        beanConfig.setScan(true);
    }
}

To access your Swagger JSON: http://<your-app>/<your-context>/rs/swagger.json

Upvotes: 3

Ron
Ron

Reputation: 14840

Based on your comment, if your application is deployed on Tomcat, than that's most likely the wrong URL.

Say the context root of your application is myapp, then your API itself will be deployed available on http://localhost:8080/myapp/api/... and the same way, the swagger docs would be available on http://localhost:8080/myapp/api/api-docs.

Upvotes: 1

Related Questions