javax.ws.rs.ext.ExceptionMapper
클래스로 WebApplicationException
을 잡으려고하는데 이상한 동작이 발생합니다.JAX-RS로 WebApplicationException을 잡는 방법
이 내 간단한 휴식 방법 :
@GET
@Path("/saySomething")
public List<String> saySomething() {
String response = EchoRestClient.ping();
List<String> list = new ArrayList<>();
list.add(response);
list.add("okay");
return list;
}
(1)이 다른 나머지 API를 호출하는 클라이언트 클래스는 다음과 같습니다
public class EchoRestClient {
private static Client client = ClientBuilder.newClient();
public static String ping() {
String serviceUrl = PropertyReader.getProperty(ServiceUrl.ECHO_SERVICE);
Response response = client
.target(serviceUrl)
.path("saySomething")
.request(ExtendedMediaType.APPLICATION_UTF8)
.get();
if (response.getStatus() == Response.Status.OK.getStatusCode()) {
return response.getEntity(String.class);
}
throw new WebApplicationException(response);
}
}
그리고 내 사용자 지정 예외 핸들러 위에 던져진 예외를 잡아 내지 못합니다 :
@Provider
public class WebservletExceptionMapper implements ExceptionMapper<Exception> {
@Override
public Response toResponse(Exception exception) {
System.out.println("caught exception");
Response response;
if (exception instanceof WebApplicationException) {
response = ((WebApplicationException) exception).getResponse();
} else {
response = Response....build();
}
return response;
}
}
(2)하지만 내가 할 경우이 예외가 잡힌 (EchoRestClient.java) :
public static String ping() {
// same code then before
WebApplicationException e = new WebApplicationException(response);
throw new RuntimeException("xxxxxx", e);
}
내 위의 코드는 잘 작동하고 난에서 saySomething
나머지 메서드를 호출 할 때 나는 적절한 응답을 얻을 내 웹 브라우저.
하지만 EchoService
휴식 (불리는 ping
휴식 방법 포함) 배포를 취소하면 HTTP 404가 첫 번째 사례에서 발견되지 않습니다. WebApplicationException이 잡히지 않았기 때문에 RuntimeException을 던질 필요가있다 (두 번째 경우).
문서에 따르면 예외 계층은 WebApplicationException extends RuntimeException입니다.
무엇이 잘못 되었나요?
- 편집 -
그때는 잘 잡힌이 예외가 던져 경우 : throw new WebApplicationException(response.getStatus())
을하지만이 사람은 작동하지 않습니다 throw new WebApplicationException(response)
는 응답 오브젝트에 뭔가 잘못인가 ?
을하고. – zappee