我正在使用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/