저지 기반 웹 서비스는 서비스 메소드에 의해 발생 된 예외를 원하는 HTTP 리턴 코드 (here)와 연관시킬 수 있다는 것을 알고 있습니다. 이제는 클라이언트가 서비스 메소드에 의해 생성 된 것과 동일한 예외를 생성 할 수있는 기회가 있습니까? 서버 측에서 MySpecificException이 발생하면 HTTP 응답에 이러한 정보 (예 : 예외 클래스의 FQN)를 저장하는 방법이 있는지 확인합니다 (자동으로 응답을 빌드하는 메서드를 사용하지 않으려 고합니다. POJO 또는 void를 반환하기를 원합니다. 클라이언트가 동일한 예외를 다시 throw 할 수 있도록 POJO 또는 void를 반환해야합니다.저지 : 클라이언트가 동일한 서버 예외를 throw하도록 만들기
1
A
답변
1
REST는 예외를 응답으로 지정하지 않으므로이를 수행하기위한 직접적인 방법은 없습니다 (RPC가 아닙니다).
그러나 자신 만의 규칙을 소개 할 수 있습니다.
이public class ForbiddenException extends WebApplicationException {
public ForbiddenException(String code, String readableMessage) {
super(Response.status(Status.FORBIDDEN).entity(new ForbiddenEntity(code, readableMessage)).build());
}
}
(당신은 아마 ExceptionMapper에 응답하는 대신 예외 자체를 구성해야하지만,이 데모 목적을 위해 단지이다) 예를 들어 :
공급자 측면에서 당신은 ForbiddenException
을 정의 할 수 있습니다.
그리고 소비자 측
-ClientFilter
: 이것은 한 서버가 규칙 및 클라이언트 준수로 작동
public class ForbiddenExceptionClientFilter extends ClientFilter {
@Override
public ClientResponse handle(ClientRequest cr) throws ClientHandlerException {
ClientResponse response = getNext().handle(cr);
if (response.getStatus() == Status.FORBIDDEN.getStatusCode()) {
ForbiddenEntity reason = response.getEntity(ForbiddenEntity.class);
throw new RemoteResourceForbiddenException(reason.getCode(), reason.getReadableMessage());
}
return response;
}
}
는 클라이언트 필터를 사용합니다.
stacktrace가 전송되지 않지만 "정확히 동일한"예외는 아닙니다. 그러나 클라이언트 응용 프로그램에서 의미가 없기 때문에 이것이 올바른 것입니다. stacktrace가 필요한 경우 서버 측에 ExceptionMapper
을 사용하여 로그에 인쇄해야합니다.
[복제 됨] (http://stackoverflow.com/questions/15185299/jax-rs-jersey-exceptionmappers-user-defined-exception) – gks
나는 그것이 그 문제의 중복이라고 생각하지 않습니다. 여기에서는 클라이언트가 404가 아닌 UserNotFoundException을 생성했음을 클라이언트가 알 수 있기를 원합니다. 인증 된 사용자가 아닌 권한이 충분하지 않은 사용자에게 HTTP (HTTP) 코드를 생성하는 몇 가지 이유가 있기 때문에 필요합니다. 나는 오류 메시지에 의존하여 클라이언트 측의 세부 사항을 이해하고 싶지 않습니다. – zakmck