jersey - Jersey :给定无效的请求正文时,返回400错误而不是500

标签 jersey jax-rs

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

相关文章:

java - 如何将 Web 表单与 JAX-RS 结合使用

java - 带有映射和欢迎文件的默认 servlet

java - Tomee 嵌入式适配器 + Arquillian + Jax-RS - 测试 Jaas

java - 带有 Java 5 的 Jersey

java - 使用 Jersey 和 Jackson 进行 JSON 格式化

java - Jersey Logging 过滤器为 POST 吃掉 UserPrincipal

java - 将多个 xml 对象传递给 jax-rs 服务

java - REST 端点 - Singleton 与 RequestScoped

java - 使用hibernate + jersey ws进行CRUD操作

java - Cxf jaxrs :outFaultInterceptors unable to modify message