Last active
September 29, 2023 08:06
-
-
Save simon04/51fa0d568a56f6649eb0890eedc15fab to your computer and use it in GitHub Desktop.
Lightweight REST API using Jersey on embedded Jetty server
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package root; | |
import root.resources.HelloResource; | |
import org.eclipse.jetty.server.Server; | |
import org.eclipse.jetty.servlet.ServletContextHandler; | |
import org.eclipse.jetty.servlet.ServletHolder; | |
import org.glassfish.jersey.server.ResourceConfig; | |
import org.glassfish.jersey.servlet.ServletContainer; | |
public class Application { | |
public static void main(String[] args) throws Exception { | |
ServletContextHandler handler = buildUsingResourceConfig(); // or buildUsingInitParameter() | |
Server server = new Server(8080); | |
server.setHandler(handler); | |
try { | |
server.start(); | |
server.join(); | |
} finally { | |
server.destroy(); | |
} | |
} | |
static ServletContextHandler buildUsingResourceConfig() { | |
ServletContextHandler handler = new ServletContextHandler(ServletContextHandler.NO_SESSIONS); | |
handler.setContextPath("/"); | |
ResourceConfig resourceConfig = new ResourceConfig(); | |
resourceConfig.register(HelloResource.class); | |
resourceConfig.register(HelloResource.GreetingMessageBodyWriter.class); | |
handler.addServlet(new ServletHolder(new ServletContainer(resourceConfig)), "/api/*"); | |
return handler; | |
} | |
static ServletContextHandler buildUsingInitParameter() { | |
ServletContextHandler handler = new ServletContextHandler(ServletContextHandler.NO_SESSIONS); | |
handler.setContextPath("/"); | |
ServletHolder servletHolder = handler.addServlet(ServletContainer.class, "/api/*"); | |
servletHolder.setInitOrder(0); | |
servletHolder.setInitParameter("jersey.config.server.provider.packages", "root.resources"); | |
return handler; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ext { | |
slf4jVersion = '1.7.30' | |
jettyVersion = '9.4.28.v20200408' | |
jerseyVersion = '2.31' | |
} | |
dependencies { | |
compile "org.slf4j:slf4j-api:${slf4jVersion}" | |
compile "org.slf4j:slf4j-simple:${slf4jVersion}" | |
compile "org.eclipse.jetty:jetty-server:${jettyVersion}" | |
compile "org.eclipse.jetty:jetty-servlet:${jettyVersion}" | |
compile "org.glassfish.jersey.core:jersey-server:${jerseyVersion}" | |
compile "org.glassfish.jersey.containers:jersey-container-servlet-core:${jerseyVersion}" | |
compile "org.glassfish.jersey.containers:jersey-container-jetty-http:${jerseyVersion}" | |
compile "org.glassfish.jersey.media:jersey-media-json-jackson:${jerseyVersion}" | |
compile "org.glassfish.jersey.inject:jersey-hk2:${jerseyVersion}" | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package root.resources; | |
import javax.ws.rs.GET; | |
import javax.ws.rs.Path; | |
import javax.ws.rs.PathParam; | |
import javax.ws.rs.Produces; | |
import javax.ws.rs.WebApplicationException; | |
import javax.ws.rs.core.MediaType; | |
import javax.ws.rs.core.MultivaluedMap; | |
import javax.ws.rs.ext.MessageBodyWriter; | |
import javax.ws.rs.ext.Provider; | |
import java.io.IOException; | |
import java.io.OutputStream; | |
import java.lang.annotation.Annotation; | |
import java.lang.reflect.Type; | |
import java.nio.charset.StandardCharsets; | |
@Path("/hello") | |
public class HelloResource { | |
public static class Greeting { | |
private String message; | |
public Greeting() { | |
} | |
public Greeting(String message) { | |
this.message = message; | |
} | |
public String getMessage() { | |
return message; | |
} | |
public void setMessage(String message) { | |
this.message = message; | |
} | |
} | |
@GET | |
@Path("/{param}") | |
@Produces(MediaType.APPLICATION_JSON) | |
public Greeting hello(@PathParam("param") String name) { | |
return new Greeting("Hello " + name); | |
} | |
@Provider | |
@Produces(MediaType.TEXT_PLAIN) | |
public static class GreetingMessageBodyWriter implements MessageBodyWriter<Greeting> { | |
@Override | |
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { | |
return type == Greeting.class; | |
} | |
@Override | |
public void writeTo(Greeting greeting, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream out) throws IOException, WebApplicationException { | |
out.write(greeting.getMessage().getBytes(StandardCharsets.UTF_8)); | |
out.flush(); | |
} | |
} | |
@GET | |
@Path("/{param}.txt") | |
@Produces(MediaType.TEXT_PLAIN) | |
public Greeting helloText(@PathParam("param") String name) { | |
return new Greeting("Hello " + name); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment