2016-06-29 80 views
1

是否可以在BadRequestException中包含消息,因此當用戶看到響應代碼400時,他/她也可以找出原因?如何在BadRequestException中包含消息?

的情況是這樣的,簡化:

public Entity getEntityWithOptions(@PathParam("id") String id, @QueryParam("option") String optValue) { 
    if (optValue != null) { 
     // Option is an enum 
     try { 
      Option option = Option.valueOf(optValue); 
     } catch (IllegalArgumentException e) { 
      throw new BadRequestException(e.getMessage()); 
     } 
     return new Entity(option); 
    } 
    return new Entity(); 
} 

我知道這是可以做到返回Response對象,而不是,但我不希望出現這種情況。

這可能嗎?也許與ExceptionMapper<BadRequestException>?或者由於BadRequestException已經是澤西特定的異常,因此無法完成此操作?

+0

我認爲消息可以放進構造函數,對不對?如果使用了exceptionMapper,它實際上會返回一個Response。 – Cuero

+0

我將消息傳遞給構造函數,但響應不包含它。 – dabadaba

+0

如果使用exceptionMapper,則會顯示傳遞給構造函數的消息。只需使映射器如下所示:public Response toResponse(BadRequestException e){return Response.status(Response.Status.BAD_REQUEST).type(MediaType.TEXT_PLAIN).entity(ExceptionUtils.getStackTrace(e))。build();} – Cuero

回答

0

你應該創建一個自定義異常喜歡這個

public class CustomBadReq extends WebApplicationException { 
    public CustomBadReq(String message) { 
     super(Response.status(Response.Status.BAD_REQUEST) 
      .entity(message).type(MediaType.TEXT_PLAIN).build()); 
    } 
} 

參見this

1

你可以拋出一個CustomException並將其映射到一個CustomExceptionMapper提供量身定製的響應。

public class CustomException extends RuntimeException {  
    public CustomException(Throwable throwable) { 
     super(throwable); 
    } 

    public CustomException(String string, Throwable throwable) { 
     super(string, throwable); 
    } 

    public CustomException(String string) { 
     super(string); 
    } 

    public CustomException() { 
     super(); 
    } 
} 

@Provider 
public class CustomExceptionMapper implements ExceptionMapper<CustomException> { 
    private static Logger logger = Logger.getLogger(CustomExceptionMapper.class.getName()); 
    /** 
    * This constructor is invoked when exception is thrown, after 
    * resource-method has been invoked. Using @provider. 
    */ 
    public CustomExceptionMapper() { 
     super(); 
    } 

    /** 
    * When exception is thrown by the jersey container.This method is invoked 
    */ 
    public Response toResponse(CustomException ex) { 
     logger.log(Level.SEVERE, ex.getMessage(), ex); 
     Response.ResponseBuilder resp = Response.status(Response.Status.BAD_REQUEST) 
         .entity(ex.getMessage()); 

     return resp.build(); 
    } 
} 

像這樣在代碼中使用CustomException。

public Entity getEntityWithOptions(@PathParam("id") String id, 
            @QueryParam("option") String optValue) 
            throws CustomException { 
    if (optValue != null) { 
     // Option is an enum 
     try { 
      Option option = Option.valueOf(optValue); 
     } catch (IllegalArgumentException e) { 
      throw new CustomException(e.getMessage(),e); 
     } 
     return new Entity(option); 
    } 
    return new Entity(); 
} 

除了消息外,還可以構造一個對象並通過CustomException將其傳遞給映射器。

1

有一個非常簡單的方法,如下所示。

Response.ResponseBuilder resp_builder=Response.status(Response.Status.BAD_REQUEST); 
resp_builder.entity(e.getMessage());//message you need as the body 
throw new WebApplicationException(resp_builder.build()); 

,如果你需要添加頭,響應的媒體類型或一些其他的功能,ResponseBuilder提供他們所有。

相關問題