jersey:WebApplicationException未显示自定义原因短语



(这是对原始问题的编辑,以明确此问题不是重复的-标记为重复的问题处理在响应中返回自定义错误消息,而不是向官方错误代码返回自定义原因短语)。

我试图在restful服务中为给定的Http错误代码返回一个"自定义原因短语"(不创建自定义代码或在响应中返回自定义内容),但WebApplicationException(msg,code)失败了。我刚刚找到了一篇相关的文章,解释了如何为http响应创建自定义状态对象(响应中的JAX/Jerssey自定义错误代码),并将对其进行研究,看看这是否可以作为解决方案。然而,我仍然想知道泽西岛的人们是否正在努力解决这个问题。我使用的是泽西岛的2.13版本。

关于这个问题的更多信息:HttpServletResponse.sendError(int code,String msg)方法实际上按预期工作(当直接调用时),但在调用HttpServletResponse.sendError方法之前,WebApplicationException(msg,code)调用中的"msg"参数似乎丢失了。因此,服务的客户端总是在响应中看到默认的Http错误代码原因短语。

正如您所指出的,默认行为是异常的详细消息不包括在HTTP响应中。

您可以定义一个自定义ExceptionMapper,它将执行您想要的操作。这里有一个简单的例子:

@Provider
public class CustomExceptionMapper implements ExceptionMapper<ClientErrorException> {
@Override
public Response toResponse(ClientErrorException ex) {
return Response.status(ex.getResponse().getStatus())
.entity(ex.getResponse().getStatus() + " " + ex.getMessage())
.type(MediaType.TEXT_PLAIN).
build();
}
}

此示例为属于ClientErrorException子类的任何异常(例如BadRequestExceptionForbiddenException等)定制Jersey的响应。请注意,它将异常消息(ex.getMessage)包含在响应的主体中。尽管这个响应是纯文本的,但它也可以很容易地返回JSON。

一旦你知道该找什么,就会有很多(更好的?)例子。

最新更新