Skip to content

Commit bac1dfc

Browse files
committed
Implement JAX-RS flit exception mapper
1 parent 3cd8160 commit bac1dfc

File tree

3 files changed

+87
-0
lines changed

3 files changed

+87
-0
lines changed

runtime/jaxrs/build.gradle

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,11 @@ repositories {
1111
}
1212

1313
dependencies {
14+
compile project(':runtime:core')
15+
compile group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.1'
16+
compile group: 'javax.ws.rs', name: 'javax.ws.rs-api', version: '2.1.1'
17+
compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
1418
testCompile group: 'junit', name: 'junit', version: '4.12'
19+
testCompile group: 'org.glassfish.jersey.core', name: 'jersey-common', version: '2.22.2'
20+
testCompile group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
1521
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.flit.runtime.jaxrs;
2+
3+
import com.flit.runtime.FlitException;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
import javax.servlet.http.HttpServletRequest;
7+
import javax.ws.rs.core.Context;
8+
import javax.ws.rs.core.MediaType;
9+
import javax.ws.rs.core.Response;
10+
import javax.ws.rs.ext.ExceptionMapper;
11+
import org.slf4j.Logger;
12+
import org.slf4j.LoggerFactory;
13+
14+
public class FlitExceptionMapper implements ExceptionMapper<FlitException> {
15+
16+
private static final Logger LOGGER = LoggerFactory.getLogger(FlitExceptionMapper.class);
17+
18+
@Context private HttpServletRequest request;
19+
20+
@Override
21+
public Response toResponse(FlitException exception) {
22+
LOGGER.error("Flit exception: request = {}, method = {}, code = {}, msg = {}",
23+
request.getRequestURI(), request.getMethod(), exception.getErrorCode(),
24+
exception.getMessage(), exception);
25+
26+
Map<String, Object> response = new HashMap<>();
27+
response.put("code", exception.getErrorCode().getErrorCode());
28+
response.put("msg", exception.getMessage());
29+
30+
if (exception.hasMeta()) {
31+
response.put("meta", exception.getMeta());
32+
}
33+
return Response.status(exception.getErrorCode().getHttpStatus())
34+
.type(MediaType.APPLICATION_JSON)
35+
.entity(response)
36+
.build();
37+
}
38+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.flit.runtime.jaxrs;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import com.flit.runtime.ErrorCode;
6+
import com.flit.runtime.FlitException;
7+
import java.util.Map;
8+
import javax.servlet.http.HttpServletRequest;
9+
import javax.ws.rs.core.MediaType;
10+
import javax.ws.rs.core.Response;
11+
import org.junit.Before;
12+
import org.junit.Test;
13+
import org.mockito.InjectMocks;
14+
import org.mockito.Mock;
15+
import org.mockito.MockitoAnnotations;
16+
17+
public class FlitExceptionMapperTest {
18+
19+
@Mock
20+
private HttpServletRequest request;
21+
22+
@InjectMocks
23+
private FlitExceptionMapper flitExceptionMapper = new FlitExceptionMapper();
24+
25+
@Before
26+
public void setup() {
27+
MockitoAnnotations.initMocks(this);
28+
}
29+
30+
@Test
31+
public void testToResponse() {
32+
FlitException flit = FlitException.builder()
33+
.withCause(new RuntimeException("Failed"))
34+
.withErrorCode(ErrorCode.INTERNAL)
35+
.withMessage("with this message")
36+
.build();
37+
Response response = flitExceptionMapper.toResponse(flit);
38+
assertEquals(response.getStatus(), 500);
39+
Map<String, Object> expectedResult = Map.of("msg", "with this message", "code", "internal");
40+
assertEquals(response.getEntity(), expectedResult);
41+
assertEquals(response.getMediaType(), MediaType.APPLICATION_JSON_TYPE);
42+
}
43+
}

0 commit comments

Comments
 (0)