├── 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 |
--------------------------------------------------------------------------------