Skip to content

Commit b0a8b03

Browse files
author
per
committed
release 1.0.4
1 parent 60b4bd0 commit b0a8b03

7 files changed

Lines changed: 199 additions & 10 deletions

File tree

README.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Add the following dependency to your maven pom.xml (or equivalent for your build
1616
<dependency>
1717
<groupId>se.alipsa</groupId>
1818
<artifactId>simple-rest</artifactId>
19-
<version>1.0.3</version>
19+
<version>1.0.4</version>
2020
</dependency>
2121
```
2222

@@ -137,6 +137,22 @@ List<Company> getCompanies(String jwtToken) {
137137
}
138138
```
139139

140+
## Complex return types
141+
In some cases you have some even more complex type that you want to get from the response.
142+
In these cases you create a TypeReference and pass that to the getForType method.
143+
Here is an example:
144+
145+
```groovy
146+
import se.alipsa.simplerest.*;
147+
import com.fasterxml.jackson.core.type.TypeReference;
148+
import java.util.Map;
149+
import java.util.List;
150+
151+
var restClient = new RestClient();
152+
Response response = restClient.get("https://localhost:8080/api/info");
153+
Map<String, List<String>> info = response.getForType(new TypeReference<>(){});
154+
```
155+
140156
## Using simple-rest for REST/XML
141157
The Rest service response is assumed to be JSON. If you need to use REST/XML you need to
142158
1. Add a dependency to com.fasterxml.jackson.dataformat:jackson-dataformat-xml

pom.xml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>se.alipsa</groupId>
88
<artifactId>simple-rest</artifactId>
9-
<version>1.0.4-SNAPSHOT</version>
9+
<version>1.0.4</version>
1010
<packaging>jar</packaging>
1111

1212
<name>Simple Rest</name>
@@ -43,42 +43,42 @@
4343
<dependency>
4444
<groupId>com.fasterxml.jackson.core</groupId>
4545
<artifactId>jackson-core</artifactId>
46-
<version>2.13.4</version>
46+
<version>2.14.2</version>
4747
</dependency>
4848
<dependency>
4949
<groupId>com.fasterxml.jackson.core</groupId>
5050
<artifactId>jackson-databind</artifactId>
51-
<version>2.13.4.2</version>
51+
<version>2.14.2</version>
5252
</dependency>
5353
<dependency>
5454
<groupId>com.fasterxml.jackson.datatype</groupId>
5555
<artifactId>jackson-datatype-jsr310</artifactId>
56-
<version>2.13.4</version>
56+
<version>2.14.2</version>
5757
</dependency>
5858

5959
<!-- Test dependencies -->
6060
<dependency>
6161
<groupId>org.slf4j</groupId>
6262
<artifactId>slf4j-reload4j</artifactId>
63-
<version>2.0.3</version>
63+
<version>2.0.6</version>
6464
<scope>test</scope>
6565
</dependency>
6666
<dependency>
6767
<groupId>org.eclipse.jetty</groupId>
6868
<artifactId>jetty-server</artifactId>
69-
<version>11.0.12</version>
69+
<version>11.0.13</version>
7070
<scope>test</scope>
7171
</dependency>
7272
<dependency>
7373
<groupId>org.eclipse.jetty</groupId>
7474
<artifactId>jetty-servlet</artifactId>
75-
<version>11.0.12</version>
75+
<version>11.0.13</version>
7676
<scope>test</scope>
7777
</dependency>
7878
<dependency>
7979
<groupId>org.junit.jupiter</groupId>
8080
<artifactId>junit-jupiter</artifactId>
81-
<version>5.9.1</version>
81+
<version>5.9.2</version>
8282
<scope>test</scope>
8383
</dependency>
8484
</dependencies>

releases.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# Release history
22

3-
### ver 1.0.4, In development...
3+
### ver 1.0.4, 2023-02-11
4+
- Add getForType which takes a TypeReference as parameter to be able to return "anything"
5+
- Upgrade dependencies for jackson, and test dependencies (jetty, junit, slf4j)
46

57
### ver 1.0.3, 2022-08-01
68
- upgrade test dependencies (junit, jetty).

src/main/java/se/alipsa/simplerest/Response.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,11 @@ public <T> List<T> getObjectList(Class<T> returnClass, ObjectMapper... customMap
6969
return mapper.readValue(getPayload(), mapper.getTypeFactory().constructCollectionType(List.class, returnClass));
7070
}
7171

72+
public <T> T getForType(TypeReference<T> type, ObjectMapper... customMapper) throws JsonProcessingException {
73+
ObjectMapper mapper = customMapper.length > 0 ? customMapper[0] : objectMapper;
74+
return mapper.reader().forType(type).readValue(getPayload());
75+
}
76+
7277
/**
7378
*
7479
* @return the "raw" content of the response
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package test.alipsa.simplerest;
2+
3+
import com.fasterxml.jackson.core.JsonProcessingException;
4+
import com.fasterxml.jackson.core.type.TypeReference;
5+
import org.eclipse.jetty.server.Server;
6+
import org.eclipse.jetty.server.ServerConnector;
7+
import org.eclipse.jetty.servlet.ServletContextHandler;
8+
import org.junit.jupiter.api.AfterAll;
9+
import org.junit.jupiter.api.BeforeAll;
10+
import org.junit.jupiter.api.Test;
11+
import se.alipsa.simplerest.RestClient;
12+
import se.alipsa.simplerest.RestException;
13+
import test.alipsa.simplerest.servlets.ComplexServlet;
14+
15+
import java.util.List;
16+
import java.util.Map;
17+
18+
import static org.junit.jupiter.api.Assertions.assertEquals;
19+
import static org.junit.jupiter.api.Assertions.fail;
20+
21+
public class ComplexRestTest {
22+
23+
private static Server server;
24+
private static String serverUrl;
25+
private static RestClient restClient;
26+
27+
28+
29+
@BeforeAll
30+
public static void startJetty() throws Exception {
31+
//System.out.println("Starting jetty server");
32+
server = new Server();
33+
ServerConnector connector = new ServerConnector(server);
34+
connector.setPort(0); // auto-bind to available port
35+
server.addConnector(connector);
36+
37+
ServletContextHandler context = new ServletContextHandler();
38+
context.addServlet(ComplexServlet.class,"/complex/*");
39+
server.setHandler(context);
40+
41+
server.start();
42+
43+
String host = connector.getHost();
44+
if (host == null) {
45+
host = "localhost";
46+
}
47+
int port = connector.getLocalPort();
48+
serverUrl = String.format("http://%s:%d/",host,port);
49+
restClient = new RestClient();
50+
}
51+
52+
@AfterAll
53+
public static void stopJetty() {
54+
try {
55+
server.stop();
56+
}
57+
catch (Exception e) {
58+
fail(e);
59+
}
60+
}
61+
62+
63+
@Test
64+
public void getComplexReturn() throws RestException, JsonProcessingException {
65+
var response = restClient.get(serverUrl + "complex");
66+
assertEquals(200, response.getResponseCode(), "get /complex, response Code");
67+
Map<String, List<String>> map = response.getForType(new TypeReference<>() {});
68+
assertEquals(2, map.size());
69+
assertEquals("bar", map.get("two").get(1));
70+
}
71+
72+
}

src/test/java/test/alipsa/simplerest/SimpleRestTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import se.alipsa.simplerest.RestClient;
1515
import se.alipsa.simplerest.RestException;
1616
import test.alipsa.simplerest.model.Company;
17+
import test.alipsa.simplerest.servlets.ComplexServlet;
1718
import test.alipsa.simplerest.servlets.SimpleServlet;
1819

1920
import java.util.List;
@@ -68,6 +69,11 @@ public void simpleGetTest() throws RestException, JsonProcessingException {
6869
assertEquals(123, company.getNumber(), "company number");
6970
}
7071

72+
@Test
73+
public void getComplexReturn() {
74+
75+
}
76+
7177
@Test
7278
public void simplePostTest() throws RestException, JsonProcessingException {
7379
Company company = new Company();
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package test.alipsa.simplerest.servlets;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import jakarta.servlet.ServletException;
5+
import jakarta.servlet.http.HttpServlet;
6+
import jakarta.servlet.http.HttpServletRequest;
7+
import jakarta.servlet.http.HttpServletResponse;
8+
import se.alipsa.simplerest.MediaType;
9+
import test.alipsa.simplerest.model.Company;
10+
11+
import java.io.IOException;
12+
import java.nio.charset.StandardCharsets;
13+
import java.util.HashMap;
14+
import java.util.List;
15+
import java.util.Map;
16+
17+
public class ComplexServlet extends HttpServlet {
18+
19+
@Override
20+
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
21+
//System.out.println("In SimpleServlet.doGet for " + req.getRequestURI());
22+
resp.setStatus(200);
23+
resp.setContentType(MediaType.APPLICATION_JSON.getValue());
24+
var writer = resp.getWriter();
25+
ObjectMapper mapper = new ObjectMapper();
26+
Map<String, List<String>> map = new HashMap<>();
27+
map.put("one", List.of("a", "b", "c"));
28+
map.put("two", List.of("foo", "bar", "baz"));
29+
String value = mapper.writeValueAsString(map);
30+
resp.setContentLength(value.getBytes(StandardCharsets.UTF_8).length);
31+
writer.print(value);
32+
writer.close();
33+
}
34+
35+
@Override
36+
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
37+
//System.out.println("In SimpleServlet.doPost for " + req.getRequestURI());
38+
resp.setStatus(200);
39+
resp.setContentType(MediaType.APPLICATION_JSON.getValue());
40+
ObjectMapper mapper = new ObjectMapper();
41+
var company = mapper.readValue(req.getInputStream(), Company.class);
42+
company.setNumber(191919);
43+
var writer = resp.getWriter();
44+
writer.print(mapper.writeValueAsString(company));
45+
writer.close();
46+
}
47+
48+
@Override
49+
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
50+
//System.out.println("In SimpleServlet.doPut for " + req.getRequestURI());
51+
resp.setStatus(200);
52+
resp.setContentType(MediaType.APPLICATION_JSON.getValue());
53+
ObjectMapper mapper = new ObjectMapper();
54+
var company = mapper.readValue(req.getInputStream(), Company.class);
55+
var writer = resp.getWriter();
56+
writer.print(mapper.writeValueAsString(company));
57+
writer.close();
58+
}
59+
60+
@Override
61+
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
62+
//System.out.println("In SimpleServlet.doDelete for " + req.getRequestURI());
63+
if (req.getRequestURI().endsWith("/company/123")) {
64+
resp.setStatus(204);
65+
} else {
66+
resp.setStatus(404);
67+
}
68+
resp.setContentLength(0);
69+
}
70+
71+
@Override
72+
protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
73+
//System.out.println("In SimpleServlet.doHead for " + req.getRequestURI());
74+
resp.setStatus(200);
75+
resp.setContentType(MediaType.APPLICATION_JSON.getValue());
76+
ObjectMapper mapper = new ObjectMapper();
77+
Company company = new Company("ABC", 123);
78+
String value = mapper.writeValueAsString(company);
79+
resp.setContentLength(value.getBytes(StandardCharsets.UTF_8).length);
80+
}
81+
82+
@Override
83+
protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
84+
//System.out.println("In SimpleServlet.doOptions for " + req.getRequestURI());
85+
resp.setContentType(MediaType.APPLICATION_JSON.getValue());
86+
super.doOptions(req, resp);
87+
}
88+
}

0 commit comments

Comments
 (0)