JAX-RS / Jersey :更改来自 Jackson JSON 错误的响应正文

JAX-RS / Jersey : Change response body from Jackson JSON errors

我有一个使用 jersey 的休息端点,我 "drop" 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 值不匹配的值并发出请求时,我得到这个:

Can not construct instance of com.utility.AdminStatus from String value 'ACTIVEE': value not one of declared Enum instance names: [NONACTIVE, ACTIVE]
at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@2848cd9d; line: 1, column: 328] (through reference chain: com.dto.AdminUpdateDTO["status"])

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

这是 Jackson 提供程序异常映射器的默认行为:以 return 异常消息作为响应。如果您想要不同的回应,create your own mappers for JsonMappingException and JsonParseException, as mentioned .

更新

这里有几个例子

@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...。您需要确保这些映射器已注册。如果您正在使用扫描,则 class 应该从 @Provider 注释中提取。否则,您将需要手动注册,无论您以何种方式注册您的资源和提供商。