以下ExceptionMapper无法捕获IllegalArgumentException
并向客户端返回BAD_REQUEST响应的原因是什么?
如果客户端将JSON数组而不是预期的JSON对象发送到JAX-RS资源,则此ExceptionMapper应该捕获异常并以400响应。此外,它还提供了一个JSON对象来更详细地描述错误。
@Provider
public class IllegalArgumentExceptionMapper implements ExceptionMapper<IllegalArgumentException> {
public Response toResponse(IllegalArgumentException ex) {
JsonObject json = Json.createObjectBuilder().add("message", "Body should be a JSON Object").build();
return Response.status(Response.Status.BAD_REQUEST).entity(json).build();
}
}
然而,它没有这样做,而是客户端在响应中收到带有HTML格式的堆栈跟踪的500以及日志中的以下内容:
[2017-07-03T03:47:02.635+0000] [Payara 4.1] [WARNING] [] [javax.enterprise.web]
[tid: _ThreadID=28 _ThreadName=http-listener-1(1)] [timeMillis: 1499053622635]
[levelValue: 900] [[ StandardWrapperValve[myApp.JaxRsConfiguration]:
Servlet.service() for servlet myApp.JaxRsConfiguration threw exception
java.lang.IllegalArgumentException: argument type mismatch
这是资源操作:
@POST
public Response postSignup(JsonObject signupJson) throws UnprocessableEntityException { ... }
我们在这里谈论Java EE 7,我尝试使用Payara 4.1和股票JAX-RS Provider运行,没有涉及框架。