SpringFox cannot find jax-rs endpoints

After the solution Using Springfox to document jax-rs services in a Spring application, I now find that the SpringFox JSON response does not show any APIs:

{ "swagger": "2.0", "info": { "description": "Some description", "version": "1.0", "title": "My awesome API", "contact": { "name": " my-email@domain.org " }, "license": {} }, "host": "localhost:9090", "basePath": "/myapp" } 

Here is springfox-servlet.xml:

 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean class="com.wordnik.swagger.jaxrs.listing.ApiListingResourceJSON" /> <bean class="com.wordnik.swagger.jaxrs.listing.ApiDeclarationProvider" /> <bean class="com.wordnik.swagger.jaxrs.listing.ResourceListingProvider" /> </beans> 

This is the properties file:

 swagger.resourcePackage=org.myapp 

Swagger is configured to look for implementation classes using the jax-rs reflective scanner:

 @Component public class SwaggerConfiguration { @Value("${swagger.resourcePackage}") private String resourcePackage; @PostConstruct public void init() { ReflectiveJaxrsScanner scanner = new ReflectiveJaxrsScanner(); scanner.setResourcePackage(resourcePackage); ScannerFactory.setScanner(scanner); ClassReaders.setReader(new DefaultJaxrsApiReader()); SwaggerConfig config = ConfigFactory.config(); config.setApiVersion(apiVersion); config.setBasePath(basePath); } public String getResourcePackage() { return resourcePackage; } public void setResourcePackage(String resourcePackage) { this.resourcePackage = resourcePackage; } } 

Here is the documentation configuration:

 @Configuration @EnableSwagger2 public class ApiDocumentationConfiguration { @Bean public Docket documentation() { System.out.println("=========================================== Initializing Swagger"); return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build() .pathMapping("/") .apiInfo(metadata()); } @Bean public UiConfiguration uiConfig() { return UiConfiguration.DEFAULT; } private ApiInfo metadata() { return new ApiInfoBuilder() .title("My awesome API") .description("Some description") .version("1.0") .contact(" my-email@domain.org ") .build(); } } 

And here is a sample class with api annotations:

 @Api(value = "activity") @Service @Path("api/activity") @Produces({ MediaType.APPLICATION_JSON }) public class ActivityService { @Autowired private CommandExecutor commandExecutor; @Autowired private FetchActivityCommand fetchActivityCommand; @ApiOperation(value = "Fetch logged-in user activity", httpMethod = "GET", response = Response.class) @GET @Path("/mine") @Consumes(MediaType.TEXT_PLAIN) @Produces(MediaType.APPLICATION_JSON) @Authorization(rejectionMessage = Properties.Authorization.NOT_LOGGED_IN_MESSAGE_PREFIX + "view your activities.") public List<Activity> listMyActivities(@Context HttpServletResponse response, @Context HttpServletRequest request) throws IOException { return buildActivityList(response, (UUID) request.getSession().getAttribute(Properties.Session.SESSION_KEY_USER_GUID)); } ... } 

Why doesn't it expose the API? Will using the wordnik swagger library solve this problem or improve the solution?

+6
source share
1 answer

By default, SpringFox will document your REST services implemented with Spring MVC - it's as simple as adding the @EnableSwagger2 annotation

 @SpringBootApplication @EnableSwagger2 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 

I managed to get SpringFox to work with JAX-RS First, I added some dependent dependencies along with SpringFox:

 dependencies { compile("org.springframework.boot:spring-boot-starter-web") compile("org.springframework.boot:spring-boot-starter-jersey") compile("io.springfox:springfox-swagger-ui:2.4.0") compile("io.springfox:springfox-swagger2:2.4.0") compile("io.swagger:swagger-jersey2-jaxrs:1.5.8") testCompile("junit:junit") } 

Then I turned on JAX-RS (Jersey) with Swagger in my spring-boot application:

 @Component @ApplicationPath("/api") public static class JerseyConfig extends ResourceConfig { public JerseyConfig() { BeanConfig swaggerConfig = new BeanConfig(); swaggerConfig.setBasePath("/api"); SwaggerConfigLocator.getInstance().putConfig(SwaggerContextService.CONFIG_ID_DEFAULT, swaggerConfig); packages(getClass().getPackage().getName(), ApiListingResource.class.getPackage().getName()); } } 

Please note that all JAX-RS endpoints will be under the /api context - otherwise this conflicts with the spring-MVC manager

Finally, we need to add the jagged swagger generated for the Jersey endpoints to Springfox:

 @Component @Primary public static class CombinedSwaggerResourcesProvider implements SwaggerResourcesProvider { @Resource private InMemorySwaggerResourcesProvider inMemorySwaggerResourcesProvider; @Override public List<SwaggerResource> get() { SwaggerResource jerseySwaggerResource = new SwaggerResource(); jerseySwaggerResource.setLocation("/api/swagger.json"); jerseySwaggerResource.setSwaggerVersion("2.0"); jerseySwaggerResource.setName("Jersey"); return Stream.concat(Stream.of(jerseySwaggerResource), inMemorySwaggerResourcesProvider.get().stream()).collect(Collectors.toList()); } } 

What is it! Your JAX-RS endpoints will now be documented by Swagger. I used the following sample endpoint:

 import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Component; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Component @Path("/hello") @Api public class Endpoint { @GET @ApiOperation("Get message") @Produces(MediaType.TEXT_PLAIN) public String message() { return "Hello"; } } 

Now when you start your server and navigate to http: // localhost: 8080 / swagger-ui.html , you will see the documentation for the JAX-RS endpoints. Use the combobox at the top of the page to go to the documentation for Spring MVC endpoints

enter image description here

+10
source

All Articles