How to integrate swagger with jersey + spring-boot

旧巷老猫 提交于 2019-12-07 18:08:45

问题


I am using springboot + jersey for web restful implementation. Now I am going to integrate swagger into our application. I did following.

@Configuration
@EnableSwagger2
public class JerseyConfiguration extends ResourceConfig {

    public JerseyConfiguration(){
        register(HelloworldAPI.class);
        configureSwagger();
    }

    private void configureSwagger() {
        BeanConfig beanConfig = new BeanConfig();
        beanConfig.setVersion("1.0.2");
        beanConfig.setSchemes(new String[]{"http"});
        beanConfig.setHost("localhost:8080");
        beanConfig.setBasePath("/");
        beanConfig.setResourcePackage("com.cooltoo.api");
        beanConfig.setPrettyPrint(true);
        beanConfig.setScan(true);
    }
}

I added following dependences on build.gradle:

compile('io.springfox:springfox-swagger2:'+springfoxSwaggerVersion)
compile('io.springfox:springfox-petstore:'+springfoxSwaggerVersion)
compile('io.springfox:springfox-swagger-ui:'+springfoxSwaggerVersion)
compile('io.swagger:swagger-jersey2-jaxrs:1.5.8')

I was able to launch the web application but I wander which url is for swagger? I tried with http://localhost:8080, http://localhost:8080/swagger, and http://localhost:8080/swagger-ui.html. But none of them could be accessed.


回答1:


I think @EnableSwagger2 annotation and springfox dependencies would work if the endpoints are implemented using Spring MVC instead of a JAX-RS implementation.

I blogged about this a few months ago, Microservices using Spring Boot, Jersey Swagger and Docker

Basically if you need to document your Jersey-implemented endpoints, you would need to:

1) Make sure your Spring Boot app scans for components located in specific packages (ie com.asimio.jerseyexample.config) via:

@SpringBootApplication(
    scanBasePackages = {
        "com.asimio.jerseyexample.config", "com.asimio.jerseyexample.rest"
    }
)

2) Jersey configuration class implementation:

package com.asimio.jerseyexample.config;
...
@Component
public class JerseyConfig extends ResourceConfig {

    @Value("${spring.jersey.application-path:/}")
    private String apiPath;

    public JerseyConfig() {
        // Register endpoints, providers, ...
        this.registerEndpoints();
    }

    @PostConstruct
    public void init() {
        // Register components where DI is needed
        this.configureSwagger();
    }

    private void registerEndpoints() {
        this.register(HelloResource.class);
        // Access through /<Jersey's servlet path>/application.wadl
        this.register(WadlResource.class);
    }

    private void configureSwagger() {
        // Available at localhost:port/swagger.json
        this.register(ApiListingResource.class);
        this.register(SwaggerSerializers.class);

        BeanConfig config = new BeanConfig();
        config.setConfigId("springboot-jersey-swagger-docker-example");
        config.setTitle("Spring Boot + Jersey + Swagger + Docker Example");
        config.setVersion("v1");
        config.setContact("Orlando L Otero");
        config.setSchemes(new String[] { "http", "https" });
        config.setBasePath(this.apiPath);
        config.setResourcePackage("com.asimio.jerseyexample.rest.v1");
        config.setPrettyPrint(true);
        config.setScan(true);
    }
}

3) Resource implementation using JAX-RS (Jersey) and Swagger annotations:

package com.asimio.jerseyexample.rest.v1;
...
@Component
@Path("/")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Api(value = "Hello resource", produces = "application/json")
public class HelloResource {

    private static final Logger LOGGER = LoggerFactory.getLogger(HelloResource.class);

    @GET
    @Path("v1/hello/{name}")
    @ApiOperation(value = "Gets a hello resource. Version 1 - (version in URL)", response = Hello.class)
    @ApiResponses(value = {
        @ApiResponse(code = 200, message = "Hello resource found"),
        @ApiResponse(code = 404, message = "Hello resource not found")
    })
    public Response getHelloVersionInUrl(@ApiParam @PathParam("name") String name) {
        LOGGER.info("getHelloVersionInUrl() v1");
        return this.getHello(name, "Version 1 - passed in URL");
    }
...
}

4) Make sure your app's Spring Boot configuration file makes a distinction between Spring MVC (for actuator endpoints) and Jersey (for resources) endpoints:

application.yml

...
# Spring MVC dispatcher servlet path. Needs to be different than Jersey's to enable/disable Actuator endpoints access (/info, /health, ...)
server.servlet-path: /
# Jersey dispatcher servlet
spring.jersey.application-path: /api
...



回答2:


I would Suggest to Use Simply Swagger Jersey JAXRS dependency and start . Using Swagger With Spring Boot is fairly easy but when it comes to using with Jersey , it can be tricky.

First Thing that we need to do is Configure Swagger to Use with Jersey and update your Jersey Config like below.

Jersey Config is the Place where we need to do All Configurations

import io.swagger.jaxrs.config.BeanConfig;
import io.swagger.jaxrs.listing.ApiListingResource;
import io.swagger.jaxrs.listing.SwaggerSerializers;

import javax.annotation.PostConstruct;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

import org.glassfish.jersey.server.ResourceConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
    @Component
    @ApplicationPath("/api")
    public class JerseyConfig extends ResourceConfig {
        @Autowired
        public JerseyConfig(ObjectMapper objectMapper) {

            packages("com.rest.resources"); 
            // u can also specify resource class names like below
            //register(UserResource.class)  
            //register(AdminResource.class)

        }

         @PostConstruct
          public void init() {
            // Register components where DI is needed
            this.SwaggerConfig();
          }
        private void SwaggerConfig() {
            this.register(ApiListingResource.class);
            this.register(SwaggerSerializers.class);

            BeanConfig swaggerConfigBean = new BeanConfig();
            swaggerConfigBean.setConfigId("Swagger Jersey Example");
            swaggerConfigBean.setTitle("Using Swagger ,Jersey And Spring Boot ");
            swaggerConfigBean.setVersion("v1");
            swaggerConfigBean.setContact("DeveloperName");
            swaggerConfigBean.setSchemes(new String[] { "http", "https" });
            swaggerConfigBean.setBasePath("/api");
            swaggerConfigBean.setResourcePackage("com.rest.resources");
            swaggerConfigBean.setPrettyPrint(true);
            swaggerConfigBean.setScan(true);
          }

Now that we have done all configurations, we need to verify that swagger.json is generated successfully or not . This is an important step , verify following URL .

http://localhost:PORT/baseContext/api/swagger.json

As we have given @Application Path as "/api" and we have not configured any context so our base context is "/".Hence We visit url as http://localhost:8080/api/swagger.json.

Now that our swagger.json is loaded we now need to configure Swagger UI . Its just like a Static HTML or resource access in a simple web app.

If you are not sure how to configure, please visit this article which says how to load swagger-UI at the end of the article.




回答3:


Maybe you use rather old version of springfox, but now (for version 2.4.0) it must be configured very different from your code, see http://springfox.github.io/springfox/docs/current/

For example, I have the following springfox configuration:

@Configuration
@EnableSwagger2
class SwaggerConfig {
    @Bean
    Docket rsApi() {
        new Docket(DocumentationType.SWAGGER_12)
            .apiInfo(apiInfo())
            .select()
                    .apis(RequestHandlerSelectors.basePackage('com.test.service'))
            .paths(PathSelectors.any())
            .build()
            .pathMapping('/')
            .useDefaultResponseMessages(false)
    }

    private ApiInfo apiInfo() {
        new ApiInfoBuilder()
            .title('Test API')
            .description('Test API')
            .version('0.0.10.SNAPSHOT')
            .termsOfServiceUrl('')
            .contact('Test company')
            .license('Public')
            .licenseUrl('http://example.com/')
            .build()
    }
}


来源:https://stackoverflow.com/questions/35966204/how-to-integrate-swagger-with-jersey-spring-boot

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!