Jax rs 枚举反序列化不区分大小写



>我有一个使用 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>

对于activeACTIVEActive请求内容转换,我建议您使用 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;

最新更新