Skip to content

Instantly share code, notes, and snippets.

@simon04
Last active September 29, 2023 08:06
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save simon04/51fa0d568a56f6649eb0890eedc15fab to your computer and use it in GitHub Desktop.
Save simon04/51fa0d568a56f6649eb0890eedc15fab to your computer and use it in GitHub Desktop.
Lightweight REST API using Jersey on embedded Jetty server
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;
}
}
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}"
}
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