I was able to fix the issue with this help. Thanks a lot. Best, Aniruddha ========
ᐧ On Thu, May 20, 2021 at 3:15 AM Jan Supol <[email protected]> wrote: > Hi, > The message > "org.glassfish.jersey.server.model.ModelValidationException: Validation of > the application resource model has failed during application > initialization." > tells you the resource class is not understood by Jersey. I assume it is > because you use the spring @RequestBody annotation instead of JAX-RS > @Context annotation. I am not sure you would be able to inject the > Jetty-specific Request, though. > -- Jan > ------------------------------ > *From:* jersey-dev <[email protected]> on behalf of > Aniruddha Tekade via jersey-dev <[email protected]> > *Sent:* Wednesday, May 19, 2021 10:23 PM > *To:* JETTY user mailing list <[email protected]> > *Cc:* Aniruddha Tekade <[email protected]>; [email protected] < > [email protected]> > *Subject:* [External] : [jersey-dev] Jersey servlet failing to intercept > the api calls > > Hello Community, > > I have been stuck at this issue for a long time now and need help in > identifying what am I doing wrong. > I have Jetty 11 and Jersey 3.0.2 and Swagger-core 2.1.9. I am wondering if > any of the following are wrong in my project: > > 1. Jetty & Jersey integration > 2. Dependencies w.r.to > > <https://urldefense.com/v3/__http://w.r.to__;!!GqivPVa7Brio!NZkjuqcKmBdDWXnNn7lkazSJXRkSjUGzYYkd_izfTZX_A8PDzNp_LDr5uK5KIOI0$> > Jetty and Jersey > 3. Annotations of API > > My control flow is as follows: > > 1. Created jetty server that has 128 queue size > 2. Created a jetty servlet holder > 3. Added Jersey servlet so intercept / scan all my API paths > 4. I use Jakarta namespace for this project (you can find in the > bottommost gradle for the dependencies ) > > But when I run the server with the above setting, I get: > > Caused by: org.glassfish.jersey.server.model.ModelValidationException: > Validation of the application resource model has failed during application > initialization. > > > However, all my API calls are accessible without jersey or swagger servlet > added and I confirmed this by exercising them using python script and also > using postman. Now that I want to generate a swagger.json or openapi.yaml > for all my apis, I try to scan using jersey model as follows: > > // Setup API resources > ServletHolder jersey = > servletContextHandler.addServlet(ServletContainer.class, "/api/*"); > jersey.setInitOrder(1); > jersey.setInitParameter("jersey.config.server.provider.packages", > "com.cloudian.hfs.handlers;io.swagger.v3.jaxrs2.integration.resources"); > > > Where com.cloudian.hfs.handlers contain all resource classes and apis. > What am I doing wrong? For detailed code: > > *Jersy and Jetty integration:* > > import com.cloudian.hfs.handlers.*; > import io.swagger.v3.jaxrs2.integration.OpenApiServlet; > import org.eclipse.jetty.server.HttpConfiguration; > import org.eclipse.jetty.server.HttpConnectionFactory; > import org.eclipse.jetty.server.Server; > import org.eclipse.jetty.server.ServerConnector; > import org.eclipse.jetty.server.handler.ContextHandler; > import org.eclipse.jetty.server.handler.ContextHandlerCollection; > import org.eclipse.jetty.util.thread.QueuedThreadPool; > import org.eclipse.jetty.servlet.ServletContextHandler; > import org.eclipse.jetty.servlet.ServletHolder; > import org.glassfish.jersey.servlet.ServletContainer; > import java.util.logging.Level; > import java.util.logging.Logger; > > public class StartHFS { > > public static void main(String[] args) throws Exception { > System.out.println("StartHFS"); > > // Create and configure a ThreadPool. > QueuedThreadPool threadPool = new QueuedThreadPool(); > threadPool.setName("server"); > > // Create a Server instance. > Server server = new Server(threadPool); > > // HTTP configuration and connection factory. > HttpConfiguration httpConfig = new HttpConfiguration(); > HttpConnectionFactory http11 = new > HttpConnectionFactory(httpConfig); > > // Create a ServerConnector to accept connections from clients. > ServerConnector connector = new ServerConnector(server, 1, 1, > http11); > connector.setPort(8080); > connector.setHost("0.0.0.0"); > connector.setAcceptQueueSize(128); > server.addConnector(connector); > > addHandlers(server); > > // Start the Server so it starts accepting connections from > clients. > try { > server.start(); > server.join(); > } catch (Exception ex) { > Logger.getLogger(StartHFS.class.getName()).log(Level.SEVERE, > "Fail to start HFS Server", ex); > } finally { > server.destroy(); > } > > System.out.println("StartHFS DONE"); > } > > static void addHandlers(final Server server) throws Exception { > ContextHandlerCollection contexts = new ContextHandlerCollection(); > server.setHandler(contexts); > > ContextHandler featureStoreHandler = new > ContextHandler("/featurestore"); > featureStoreHandler.setHandler(new FeatureStoreHandler()); > contexts.addHandler(featureStoreHandler); > > > // Setup Jetty Servlet > ServletContextHandler servletContextHandler = new > ServletContextHandler(ServletContextHandler.SESSIONS); > servletContextHandler.setContextPath("/"); > contexts.addHandler(servletContextHandler); > > // Setup API resources > ServletHolder jersey = > servletContextHandler.addServlet(ServletContainer.class, "/api/*"); > jersey.setInitOrder(1); > jersey.setInitParameter("jersey.config.server.provider.packages", > "com.cloudian.hfs.handlers;io.swagger.v3.jaxrs2.integration.resources"); > > // Expose API definition independently into yaml/json > ServletHolder openApi = > servletContextHandler.addServlet(OpenApiServlet.class, "/openapi/*"); > openApi.setInitOrder(2); > openApi.setInitParameter("openApi.configuration.resourcePackages", > "com.cloudian.handlers;io.swagger.sample.resource"); > } > } > > *Gradle Dependencies:* > > plugins { > id 'java' > id "io.swagger.core.v3.swagger-gradle-plugin" version "2.1.9" > } > > group 'com.cloudian' > version '1.0-SNAPSHOT' > > repositories { > mavenCentral() > } > > dependencies { > // Basic Gradle dependencies > testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' > testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' > > // Logging dependencies > runtimeOnly 'org.slf4j:slf4j-api:1.7.7' > runtimeOnly 'org.slf4j:slf4j-log4j12:1.7.7' > > // Jetty dependencies > implementation 'org.eclipse.jetty:jetty-server:11.0.0' > implementation 'org.eclipse.jetty:jetty-servlet:11.0.0' > implementation 'org.eclipse.jetty:jetty-util:11.0.0' > > // Jersey dependencies > implementation > 'org.glassfish.jersey.containers:jersey-container-jetty-http:3.0.2' > implementation > 'org.glassfish.jersey.containers:jersey-container-servlet-core:3.0.2' > // implementation 'org.glassfish.jersey.core:jersey-server:3.0.2' > implementation > 'org.glassfish.jersey.media:jersey-media-json-binding:3.0.2' > implementation 'org.glassfish.jersey.core:jersey-common:3.0.2' > // Jetty and Jersey InjectionManagerFactory dependency [Required] > implementation 'org.glassfish.jersey.inject:jersey-hk2:3.0.2' > // Enable JAXBContext and WADL Jersey [Required] > implementation 'org.glassfish.jaxb:jaxb-runtime:3.0.1' > > // Redis & Json dependencies > implementation 'org.springframework.data:spring-data-redis:2.4.3' > implementation 'redis.clients:jedis:3.3.0' > implementation group: 'org.json', name: 'json', version: '20201115' > > // Swagger, Jakarta deps > implementation 'org.apache.commons:commons-lang3:3.7' > implementation 'io.swagger.core.v3:swagger-jaxrs2-jakarta:2.1.9' > implementation 'jakarta.ws.rs:jakarta.ws.rs-api:3.0.0' > 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 = 'YAML' > prettyPrint = 'TRUE' > classpath = sourceSets.main.runtimeClasspath > buildClasspath = classpath > resourcePackages = ['io.test'] > outputDir = file('test') > } > > test { > useJUnitPlatform() > } > > jar { > manifest { > attributes "Main-Class": "com.cloudian.hfs.StartHFS" > } > > from { > configurations.compile.collect { it.isDirectory() ? it : > zipTree(it) } > } > } > > > *Annotation of my APIs:* > > @Path("/featurestore/") > @Produces({"application/json", "application/xml"}) > public class FeatureStoreHandler extends AbstractHandler { > > // Some final CONSTANTS for api implementation > > @Override > public void handle(String target, Request jettyRequest, > HttpServletRequest request, HttpServletResponse response) throws > IOException {} > > @POST > @Path("/create") > @Consumes("application/json") > public void createFeatureGroup(@RequestBody Request jettyRequest, > @RequestBody HttpServletRequest request, HttpServletResponse response) > throws IOException, JSONException, JedisException {} > > @DELETE > @Path("/delete") > @Consumes("application/json") > public void deleteFeatureGroup(@RequestBody Request jettyRequest, > @RequestBody HttpServletRequest request, HttpServletResponse response) > throws IOException, JedisException, JSONException {} > > @GET > @Path("/describe") > public void describeFeatureGroup(@RequestBody Request jettyRequest, > @RequestBody HttpServletRequest request, HttpServletResponse response) > throws IOException, JedisException, JSONException {} > } > > > Best, > Aniruddha > ======== > ᐧ >
_______________________________________________ jetty-users mailing list [email protected] To unsubscribe from this list, visit https://www.eclipse.org/mailman/listinfo/jetty-users
