>我有一个使用 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;
}
并且 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 但所有尝试都失败:更新 java 对象中的状态字段为 null(从字符串到枚举的转换失败,输入字符串为 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
我做错了什么?
感谢您的帮助
建议优先。如果将 XML 元素和属性宣布为大写,则最好将所有元素和属性宣布为大写。所以
@XmlRootElement(name = "Request")
public class Request
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Update")
public class Update implements Serializable {
@XmlElement(name = "Updates")
private List<Update> update;
对于基元类型和字符串,我们通常将它们宣布为 @XMLAttribute
,对于类和枚举,我们将它们宣布为 @XMLElement
。
并且您应该附加请求 XML 内容,这很重要。我根据您的定义创建它。
<Request>
<Updates>
<Update>
<ID>1</ID>
<Status>active</Status>
</Update>
</Updates>
</Request>
对于active
、ACTIVE
或Active
请求内容转换,我建议您使用 XMLAdapter。
public class StatusAdapter extends XMLAdapter<String, Status> {
@Override
public Status unmarshal(String status) throws Exception {
return Status.fromValue(status.toLowerCase()); /* ensure status is not
blank, or you should check null before toLowerCase(). Usually, `required` is
set in XML annotations, eg @XMLAttribute(name = "name", required = true) */
}
@Override
public String marshal(Status status) throws Exception {
return status.value();
}
}
并将适配器添加到您使用的状态。
@XmlElement(name = "Status", required = true)
@XMLJavaTypeAdapter(StatusAdapter.class)
private Status status;