【发布时间】:2018-04-16 12:34:07
【问题描述】:
我有一个使用 json 请求的 REST Web 服务:
@PUT
@Produces({ MediaType.APPLICATION_JSON })
@Consumes(value = { MediaType.APPLICATION_JSON })
public Response processRequest(Request request)
请求是更新列表:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Request {
@XmlElement
private List<Update> update;
}
更新类有一个枚举字段:
@XmlAccessorType(XmlAccessType.FIELD)
public class Update implements Serializable {
private static final long serialVersionUID = 1L;
@XmlElement(name = "ID")
private Integer id;
@XmlElement(name = "Status")
private Status status;
}
状态是一个枚举:
@XmlEnum
public enum Status {
@XmlEnumValue("active")
ACTIVE("active"),
@XmlEnumValue("cancelled")
CANCELLED("cancelled");
}
我希望将字符串“active”、“Active”、“ACTIVE”...反序列化为枚举 ACTIVE,但所有尝试均失败:Update java 对象中的状态字段为空(从 String 转换使用 Active 或 ACTIVE 输入字符串枚举失败)
我尝试创建一个自定义反序列化器,但不确定我做得是否好:
@Provider
public class IgnoreCaseDeserializer extends StdDeserializer<Status>{
private static final long serialVersionUID = 1L;
public IgnoreCaseDeserializer() {
this(null);
}
protected IgnoreCaseDeserializer(Class<?> vc) {
super(vc);
}
@Override
public Status deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
return Status.fromString(jp.getValueAsString().toLowerCase());
}
}
我添加了@JsonDeserialize 注释:
@JsonDeserialize(using=IgnoreCaseDeserializer.class)
@XmlEnum
public enum HopperStatus
我做错了什么?
感谢您的帮助
【问题讨论】:
-
您正在混合使用 JAXB 和 Jackson API。您的端点建议您期望 JSON 格式的请求和响应,但是您的请求和响应 bean 正在使用 JAXB (XML) API。
-
我找不到执行此操作的 JAXB 方式,因此我尝试使用 jackson。我怎样才能只使用 JAXB?