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

@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response newCustomer( CustomerRepresentation customer)
{
...
}

如果客户端发送带有无效字段的JSON,Jersey当前返回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

最佳答案

通过实现ExceptionMapper来捕获Jackson抛出的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();
    }

}

关于jersey - Jersey :给定无效的请求正文时,返回400错误而不是500,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9844654/

10-11 22:10
查看更多