├── rest-server ├── src │ └── main │ │ └── java │ │ └── edomingues │ │ └── restserver │ │ ├── model │ │ └── Saying.java │ │ ├── rest │ │ └── HelloWorldResource.java │ │ └── Main.java └── pom.xml ├── README.md └── rest-test ├── pom.xml └── src └── test └── java └── edomingues └── resttest └── RestServiceTest.java /rest-server/src/main/java/edomingues/restserver/model/Saying.java: -------------------------------------------------------------------------------- 1 | package edomingues.restserver.model; 2 | 3 | import javax.xml.bind.annotation.XmlRootElement; 4 | 5 | @XmlRootElement 6 | public class Saying { 7 | 8 | public String name; 9 | 10 | public Saying() { 11 | 12 | } 13 | 14 | public Saying(String name) { 15 | this.name = name; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | jersey2-jetty-example 2 | ===================== 3 | 4 | This is an example of a Rest embedded server in a java application using Jersey 2, Jetty, and Jackson. 5 | The 'rest-server' directory has the source code for the server. 6 | The 'rest-test' directory has a project to test the Rest interface. 7 | 8 | Compiling using Maven 9 | --------------------- 10 | To compile the server using Maven type `mvn install` in the 'rest-server' directory. 11 | 12 | To run the server type `java -jar target/rest-server-1.0.0.jar`. 13 | 14 | To compile and run the test project type `mvn test` in the 'rest-test' directory (for the tests to succeed the server must be running). 15 | -------------------------------------------------------------------------------- /rest-server/src/main/java/edomingues/restserver/rest/HelloWorldResource.java: -------------------------------------------------------------------------------- 1 | package edomingues.restserver.rest; 2 | 3 | import javax.ws.rs.GET; 4 | import javax.ws.rs.Path; 5 | import javax.ws.rs.PathParam; 6 | import javax.ws.rs.Produces; 7 | import javax.ws.rs.core.MediaType; 8 | 9 | import edomingues.restserver.model.Saying; 10 | 11 | 12 | @Path("/hello") 13 | public class HelloWorldResource { 14 | 15 | private static final String TEMPLATE = "Hello, %s!"; 16 | 17 | @GET 18 | @Path("{name}") 19 | @Produces(MediaType.APPLICATION_JSON) 20 | public Saying sayHello(@PathParam("name") String name) { 21 | return new Saying(String.format(TEMPLATE, name)); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /rest-test/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4.0.0 4 | 5 | edomingues 6 | rest-test 7 | 1.0.0 8 | 9 | 10 | 11 | 12 | edomingues 13 | rest-server 14 | 1.0.0 15 | test 16 | 17 | 18 | 19 | junit 20 | junit 21 | 4.11 22 | test 23 | 24 | 25 | 26 | org.hamcrest 27 | hamcrest-all 28 | 1.3 29 | test 30 | 31 | 32 | 33 | 34 | org.glassfish.jersey.core 35 | jersey-client 36 | 2.0 37 | test 38 | 39 | 40 | 41 | org.glassfish.jersey.media 42 | jersey-media-json-jackson 43 | 2.0 44 | test 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /rest-test/src/test/java/edomingues/resttest/RestServiceTest.java: -------------------------------------------------------------------------------- 1 | package edomingues.resttest; 2 | import static org.hamcrest.Matchers.equalTo; 3 | import static org.hamcrest.Matchers.is; 4 | import static org.junit.Assert.assertThat; 5 | 6 | import javax.ws.rs.client.Client; 7 | import javax.ws.rs.client.ClientBuilder; 8 | import javax.ws.rs.client.WebTarget; 9 | import javax.ws.rs.core.MediaType; 10 | 11 | import org.glassfish.jersey.client.ClientConfig; 12 | import org.glassfish.jersey.jackson.JacksonFeature; 13 | import org.junit.Before; 14 | import org.junit.Test; 15 | import edomingues.restserver.model.Saying; 16 | 17 | public class RestServiceTest { 18 | 19 | private static final String TARGET_URI = "http://localhost:8080/hello"; 20 | private static final String NAME = "world"; 21 | private static final String EXPECTED = "Hello, " + NAME + "!"; 22 | private static final String EXPECTED_JSON = "{\"name\":\"" + EXPECTED + "\"}"; 23 | 24 | private WebTarget target; 25 | 26 | @Before 27 | public void setUp() { 28 | ClientConfig clientConfig = new ClientConfig(); 29 | clientConfig.register(JacksonFeature.class); 30 | Client client = ClientBuilder.newClient(clientConfig); 31 | 32 | target = client.target(TARGET_URI); 33 | } 34 | 35 | @Test 36 | public void testHelloWorldJson() { 37 | 38 | String result = (String) target.path(NAME).request(MediaType.APPLICATION_JSON_TYPE).get(String.class); 39 | 40 | assertThat(result, is(equalTo(EXPECTED_JSON))); 41 | } 42 | 43 | @Test 44 | public void testHelloWorldObject() { 45 | Saying result = (Saying) target.path(NAME).request(MediaType.APPLICATION_JSON_TYPE).get(Saying.class); 46 | 47 | assertThat(result.name, is(equalTo(EXPECTED))); 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /rest-server/src/main/java/edomingues/restserver/Main.java: -------------------------------------------------------------------------------- 1 | package edomingues.restserver; 2 | 3 | import org.eclipse.jetty.server.Server; 4 | import org.eclipse.jetty.servlet.ServletContextHandler; 5 | import org.eclipse.jetty.servlet.ServletHolder; 6 | import org.glassfish.jersey.jackson.JacksonFeature; 7 | import org.glassfish.jersey.server.ResourceConfig; 8 | import org.glassfish.jersey.servlet.ServletContainer; 9 | 10 | import edomingues.restserver.rest.HelloWorldResource; 11 | 12 | 13 | public class Main { 14 | 15 | private static final int DEFAULT_PORT = 8080; 16 | 17 | private int serverPort; 18 | 19 | public Main(int serverPort) throws Exception { 20 | this.serverPort = serverPort; 21 | 22 | 23 | Server server = configureServer(); 24 | server.start(); 25 | server.join(); 26 | } 27 | 28 | private Server configureServer() { 29 | ResourceConfig resourceConfig = new ResourceConfig(); 30 | resourceConfig.packages(HelloWorldResource.class.getPackage().getName()); 31 | resourceConfig.register(JacksonFeature.class); 32 | ServletContainer servletContainer = new ServletContainer(resourceConfig); 33 | ServletHolder sh = new ServletHolder(servletContainer); 34 | Server server = new Server(serverPort); 35 | ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); 36 | context.setContextPath("/"); 37 | context.addServlet(sh, "/*"); 38 | server.setHandler(context); 39 | return server; 40 | } 41 | 42 | public static void main(String[] args) throws Exception { 43 | 44 | int serverPort = DEFAULT_PORT; 45 | 46 | if(args.length >= 1) { 47 | try { 48 | serverPort = Integer.parseInt(args[0]); 49 | } catch (NumberFormatException e) { 50 | e.printStackTrace(); 51 | } 52 | } 53 | 54 | new Main(serverPort); 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /rest-server/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | edomingues 7 | rest-server 8 | 1.0.0 9 | 10 | Rest Server 11 | 12 | 13 | 1.5 14 | 1.5 15 | 16 | 17 | 18 | 19 | 20 | org.eclipse.jetty 21 | jetty-server 22 | 9.0.4.v20130625 23 | 24 | 25 | 26 | org.eclipse.jetty 27 | jetty-servlet 28 | 9.0.4.v20130625 29 | 30 | 31 | 32 | org.glassfish.jersey.containers 33 | jersey-container-servlet-core 34 | 2.0 35 | 36 | 37 | 38 | org.glassfish.jersey.media 39 | jersey-media-json-jackson 40 | 2.0 41 | 42 | 43 | 44 | javax.xml 45 | jaxb-api 46 | 2.1 47 | 48 | 49 | 50 | junit 51 | junit 52 | 4.11 53 | test 54 | 55 | 56 | 57 | org.hamcrest 58 | hamcrest-all 59 | 1.3 60 | test 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | org.apache.maven.plugins 71 | maven-compiler-plugin 72 | 3.1 73 | 74 | ${java.source.level} 75 | ${java.target.level} 76 | UTF-8 77 | true 78 | true 79 | 80 | 81 | 82 | maven-assembly-plugin 83 | 84 | 85 | 86 | edomingues.restserver.Main 87 | 88 | 89 | 90 | jar-with-dependencies 91 | 92 | false 93 | 94 | 95 | 96 | package 97 | 98 | single 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | --------------------------------------------------------------------------------