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
注释中提取。否则,您将需要手动注册,无论您以何种方式注册您的资源和提供商。
我有一个使用 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
注释中提取。否则,您将需要手动注册,无论您以何种方式注册您的资源和提供商。