泽西岛:当给出无效的请求体时,返回400错误而不是500

Hol*_*osa 21 jax-rs jersey

我正在使用Jersey的集成Jackson处理将传入的JSON转换为POJO,例如:

@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response newCustomer( CustomerRepresentation customer)
{
...
}
Run Code Online (Sandbox Code Playgroud)

如果客户端发送带有无效字段的JSON,则Jersey当前返回a 500 Internal Server Error.相反,我想返回一个400 Bad Request,最好有一些有意义的细节,表明哪些字段有误.

有关如何实现这一目标的任何见解?(至少返回一个通用的400而不是完全不合适的500?)

更新: 这是在调用我的处理程序之前在服务器端生成的异常:

javax.servlet.ServletException: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: 
Unrecognized field "this_isnt_a_known"_field" (Class com.redacted....), not marked as ignorable
Run Code Online (Sandbox Code Playgroud)

Hol*_*osa 19

我终于能够解决这个问题,通过实现一个ExceptionMapper抓住UnrecognizedPropertyException杰克逊抛出的并将其映射到400 Bad Request响应:

@Provider
public class UnrecognizedPropertyExceptionMapper implements ExceptionMapper<UnrecognizedPropertyException>
{

    @Override
    public Response toResponse(UnrecognizedPropertyException exception)
    {
        return Response
                .status(Response.Status.BAD_REQUEST)
                .entity( "'" + exception.getUnrecognizedPropertyName() + "' is an unrecognized field.")
                .type( MediaType.TEXT_PLAIN)
                .build();
    }

}
Run Code Online (Sandbox Code Playgroud)