【问题标题】:JAX-RS / Jersey : Change response body from Jackson JSON errorsJAX-RS / Jersey:从 Jackson JSON 错误更改响应正文
【发布时间】:2016-09-20 05:48:46
【问题描述】:

我有一个使用 jersey 的休息端点,我将有效负载“丢弃”到具有 ENUM 类型字段的 DTO 中。

public enum AdminStatus {
   ACTIVE, NONACTIVE;
}

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class AdminUpdateDTO {

  @XmlElement(nillable = false, required = true)
  private AdminStatus status;

  public AdminStatus getStatus() {
      return status;
  }

  public void setStatus(AdminStatus status) {
     this.status = status;
  }

  @Override
  public String toString() {
     return "[status=" + this.getStatus() + "]";
  }
}

当我给这个字段一个与现有 ENUM 值不匹配的值并发出请求时,我得到这个:

无法从字符串值“ACTIVEE”构造 com.utility.AdminStatus 的实例: 值不是声明的枚举实例名称之一:[NONACTIVE, ACTIVE]
在 [来源:org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@2848cd9d;行:1,列:328](通过引用链:com.dto.AdminUpdateDTO["status"])

Jersey 是否有能力以某种方式处理此问题,我的意思是,我不想将此作为响应,而是一些自定义错误响应。

【问题讨论】:

    标签: json jersey jackson jax-rs jersey-2.0


    【解决方案1】:

    这是 Jackson 提供程序异常映射器的默认行为:将异常消息作为响应返回。如果您想要不同的响应,create your own mappers 对应于JsonMappingExceptionJsonParseException,如提到的here

    更新

    这里有几个例子

    @Provider
    public class JsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException> {
        @Override
        public Response toResponse(JsonMappingException exception) {
            return Response.status(Response.Status.BAD_REQUEST)
                    .entity("Boo..").type("text/plain").build();
        }
    }
    
    @Provider
    public class JsonParseExceptionMapper implements ExceptionMapper<JsonParseException> {
        @Override
        public Response toResponse(JsonParseException exception) {
            return Response.status(Response.Status.BAD_REQUEST)
                    .entity("Boo...").type("text/plain").build();
        }
    }
    

    这里的响应只是Boo...。您需要确保这些映射器已注册。如果您正在使用扫描,则应从@Provider 注释中选择该类。否则,无论您以何种方式注册资源和提供者,都需要手动注册。

    【讨论】:

    • 好的,但它甚至在进入其余端点方法体之前就抛出了这个错误。
    • 应该如此。错误发生在反序列化期间,发生在调用资源方法之前。异常被 Jackson 实现的 ExceptionMapper 捕获,它只返回异常消息。您需要实现自己的ExceptionMapper 以获得不同的响应。
    • 您在实现自己的ExceptionMapper 时遇到问题吗?
    • 是的,你能告诉我一些如何实现这个异常的例子吗?
    • 我提供了两个链接。最后一个链接向您展示了 Jackson 使用的确切实现。第一个文档链接,您可能需要向下滚动屏幕的大小
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    相关资源
    最近更新 更多