backend

[Jersey] WebApplicationException and Mapping Exception to Responses

버리야 2009. 7. 30. 11:29
반응형
이전에 블로깅했던 2009/06/05 - [나만의 작업] - Jersey의 Exception Handling 에 대해 조금 더 자세히 블로깅을 해봅니다. 

Jersey에서 Excpetion Handling하는 방법들

1) WebApplication을 상속한 새로운 클래스인 NotFoundException을 생성하여 던지기
 
NotFoundException을 throw하는 예
Example 1.25. Throwing Jersey specific exceptions to control response
  1 @Path("items/{itemid}/")
  2 public Item getItem(@PathParam("itemid") String itemid) {
  3     Item i = getItems().get(itemid);
  4     if (i == null)
  5         throw new NotFoundException("Item, " + itemid + ", is not found");
  6
  7     return i;
  8 }


이방법은 WebApplicationException을 상속받은 NotFoundException을 이용하는 방법

Example 1.26. Jersey specific exception implementation
  1 public class NotFoundException extends WebApplicationException {
  2
  3     /**
  4      * Create a HTTP 404 (Not Found) exception.
  5      */
  6     public NotFoundException() {
  7         super(Responses.notFound().build());
  8     }
  9
 10     /**
 11      * Create a HTTP 404 (Not Found) exception.
 12      * @param message the String that is the entity of the 404 response.
 13      */
 14     public NotFoundException(String message) {
 15         super(Response.status(Responses.NOT_FOUND).
 16                 entity(message).type("text/plain").build());
 17     }
 18
 19 }


이렇게 status를 나타내고 response를 전송할때 타입까지 정해서 보내줄 수 있다.


2) 직접 WebApplicationException에 Response status로 바로 던지기.
@Path("accounts/{accountId}/")
public Item getItem(@PathParam("accountId") String accountId) {
   
// An unauthorized user tries to enter
   
throw new WebApplicationException(Response.status.UNAUTHORIZED);
}


3) ExceptionMapper 이용하는 예

Example 1.27. Mapping generic exceptions to responses
  1 @Provider
  2 public class EntityNotFoundMapper implements
  3         ExceptionMapper<javax.persistence.EntityNotFoundException> {
  4     public Response toResponse(javax.persistence.EntityNotFoundException ex) {
  5         return Response.status(404).
  6             entity(ex.getMessage()).
  7             type("text/plain").
  8             build();
  9     }
 10 }


클래스가 @Provider로 정의되어 있고 javax.persistence.EntityNotFoundException의 toResponse메소드를 이용해 Excpetion을 Response의 status로 매핑해서 이용할 수 있다.



참고
-------------------------------------------------------------------------------------------------------------------------------------
1) Jersey 1.0.3 UserGuide 내용 중의 " WebApplicationException and Mapping Exception to Responses"
2) 
JAX-RS / Jersey how to customize error handling?
3)
  Putting Java to REST





반응형