JAX-RS / Jersey:改变Jackson JSON错误的响应体

时间:2016-05-23 11:10:45

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

我有一个使用平针织物的休息终点,我在DTO中“删除”有效负载,其中包含ENUM类型的字段。

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; line:1,column:328](通过参考链:com.dto.AdminUpdateDTO [“status”])

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

1 个答案:

答案 0 :(得分:3)

这是Jackson提供程序异常映射器的默认行为:将异常消息作为响应返回。如果您需要JsonMappingException JsonParseException@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(); } } ,请提及create your own mappers

更新

这里有几个例子

Boo...

此处的回复只是@Provider。您需要确保这些映射器已注册。如果您正在使用扫描,则应从DataTable注释中选择该类。否则,无论您注册资源和提供商,都需要手动注册。