Ask a Question

What swagger should I use with Jersey 3.0.2 REST Framework?

Occasional Contributor

What swagger should I use with Jersey 3.0.2 REST Framework?

I am working on a code-first approach in following environment:

  • Jetty 11
  • Jersey 3.0.2
  • (since Jetty 11 is part of Jakarta EE 9 big bang)
  • Gradle 7.0

I configured the jersey rest framework in the jetty server and it is already detecting all my APIs. This also means I am done annotating my APIs. Now I need to hook up swagger-core into my project. And I am referring -

In one of the links above, it has been mentioned that: Depending on the way Jersey is configured in your web service, you could hook up Swagger Core to your application using Spring, the Jersey’s container Servlet, or manually.


Since I am using Jersey 3.0.2 REST Framework into Jetty, what swagger-core version should I use to hook up swagger into my jersey container's servlet? Or is there a better approach to solve this issue easily? 

Occasional Contributor

can swagger work with Jersey 3.x? If not, what other way is there I can get this to work? 

Occasional Contributor

The main issue was in annotations of the code that I was using spring based annotations and using namespace. Here are my steps that solved the issue:


  1. 1. Upgraded the gradle as mentioned in the bottom
  2. 2. Fixed annotations
  3. 3. Configure jersey servlet and openapi servlet from swagger-core as mentioned below
  4. 4. Added content of `swagger-ui/dist/*` into `/src/resources/webapp` and pointed the index.html to `localhost:8080/openapi/swagger.json` where my openapi.yaml is being generated


plugins {
    id 'java'
    id 'application'
    id "io.swagger.core.v3.swagger-gradle-plugin" version "2.1.9"

group 'org.example'
version '1.0-SNAPSHOT'

repositories {

ext {
    javaMainClass = "io.swagger.Main"

application {
    mainClassName = javaMainClass
dependencies {
    implementation platform('org.glassfish.jersey:jersey-bom:3.0.2')
    implementation 'org.glassfish.jersey.containers:jersey-container-grizzly2-http'
    implementation 'org.glassfish.jersey.inject:jersey-hk2'
    implementation ''
    implementation 'org.apache.commons:commons-lang3:3.7'
    implementation 'io.swagger.core.v3:swagger-jaxrs2-jakarta:2.1.9'
    implementation ''
    implementation 'jakarta.servlet:jakarta.servlet-api:5.0.0'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'

resolve {
    outputFileName = 'MyRestAPI'
    outputFormat = 'JSON'
    prettyPrint = 'TRUE'
    classpath = sourceSets.main.runtimeClasspath
    buildClasspath = classpath
    resourcePackages = ['io.swagger']
    outputDir = file('test')


Jersey & openapi servlet into Jetty Server:

// Setup Jetty Servlet
ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);

// Setup API resources
ServletHolder jersey = servletContextHandler.addServlet(ServletContainer.class, "/api/*");

// Expose API definition independently into yaml/json
ServletHolder openApi = servletContextHandler.addServlet(OpenApiServlet.class, "/openapi/*");

// Setup Swagger-UI static resources
String resourceBasePath = ServiceLoader.class.getResource("/webapp").toExternalForm();
servletContextHandler.setWelcomeFiles(new String[] {"index.html"});
servletContextHandler.addServlet(new ServletHolder(new DefaultServlet()), "/*"); 

And then I was able to access swagger.json at http://localhost:8080/

Showing results for 
Search instead for 
Did you mean: