Configuration of Spring Boot with JAX-RS producing OpenAPI 3.0 specification


You can use Swagger to generate an OpenAPI 3.0 together with Spring Boot and JAX-RS by doing the following:

  1. Include spring-boot-starter-jerseyswagger-coreswagger-annotations and swagger-jaxrs in pom.xml
  2. Extend ResourceConfig and configure the packages to scan for JAX-RS annotations and register the OpenAPIResource.class of Swagger.
  3. Use Swagger Annotations to annotate your endpoints and your schema.
  4. Optionally include sprindoc-openapi-ui if you want to access Swagger via /swagger-ui.html.

1) Dependencies in pom.xml


Current swagger-version is 2.1.0.

There is a conflict with springdoc-openapi-ui and swagger-jaxrs2, which leads to an error with io.github.classgraph so this library must be excluded from swagger-jaxrs2.

2: Extending ResourceConfig

public class JaxRsConfig extends ResourceConfig {
    public JaxRsConfig() {
        // register resources

The JAX-RS annotated resources must be scanned by calling packages("com.example.jaxrs.resources").

Be careful, not to confuse with the register function!

The OpenApiResource.class comes from Swagger and offers the /openapi.json endpoint.

The reason why I use /api as @ApplicationPath is, that when using it together with springdoc-openapi-ui, the swagger-ui.html endpoint is not found when the @ApplicationPath is set to “/”. It seems that something is getting overwritten in this case. Maybe someone has an explanation for this.

3) Swagger Annotations

@Schema(name = "Message", description = "This is an object to place a message.")
public class MessageDto {

    @Schema(name="Message", required = true)
    private String message;

    public MessageDto(String message) {
        this.message = message;
    // ... getters and setters

4) Configuring SpringDoc

By default, you should be able to call /swagger-ui.html to open Swagger and browse your OpenAPI 3.0 definition.

Since the @ApplicationPath is set to /api, we need to configure SpringDoc where to look for the definition by setting a property in


You can also change the URL of Swagger with:


Other issues:

Another issue may arise, when running the application as a .jar file:

Spring boot application won’t run when trying to run from the jar file

In this case I’ve found a solution by scanning all the components with a reflection library like org.reflections like so:

    private void scan(String... packages) {
        for (String packageName : packages) {
            Reflections reflections = new Reflections(packageName);
            reflections.getTypesAnnotatedWith(Provider.class).parallelStream().forEach(clazz -> register(clazz));
            reflections.getTypesAnnotatedWith(Path.class).parallelStream().forEach(clazz -> register(clazz));


About the author

Dipl.Ing. – Dr.techn. Markus Demetz is a Software Development and Java Expert.

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.