是否可以将 Jersey 与 Moxy 一起使用来往/从 Json 和 Java 8 optional ?
如何配置?
最佳答案
您可以声明以下类:
public class OptionalAdapter<T> extends XmlAdapter<T, Optional<T>> {
@Override
public Optional<T> unmarshal(T value) throws Exception {
return Optional.ofNullable(value);
}
@Override
public T marshal(Optional<T> value) throws Exception {
return value.orElse(null);
}
}
并像这样使用:
@XmlRootElement
public class SampleRequest {
@XmlElement(type = Integer.class)
@XmlJavaTypeAdapter(value = OptionalAdapter.class)
private Optional<Integer> id;
@XmlElement(type = String.class)
@XmlJavaTypeAdapter(value = OptionalAdapter.class)
private Optional<String> text;
/* ... */
}
或者在 package-info.java
中声明并删除 @XmlJavaTypeAdapter
来自 POJO:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlJavaTypeAdapters({
@XmlJavaTypeAdapter(type = Optional.class, value = OptionalAdapter.class)
})
但这里有一些缺点:
- 上面的适配器只能处理简单类型,例如 Integer、String 等,默认情况下 MOXY 可以解析这些类型。
- 您必须指定
@XmlElement(type = Integer.class)
显式告诉解析器类型正在使用,否则null
值将传递到适配器的unmarshal
方法。 - 您错过了使用自定义类型适配器的机会,例如定制适配器
java.util.Date
基于某些日期格式字符串的类。为了克服这个问题,您需要创建类似class OptionalDateAdapter<String> extends XmlAdapter<String, Optional<Date>>
的适配器。 .
还使用 Optional
不建议在现场使用,参见this discussion了解详情。
考虑到上述所有因素,我建议仅使用 Optional
作为 POJO 的返回类型:
@XmlRootElement
public class SampleRequest {
@XmlElement
private Integer id;
public Optional<Integer> getId() {
return Optional.ofNullable(id);
}
public void setId(Integer id) {
this.id = id;
}
}
关于java-8 - 如何将 Java 8 可选与 Moxy 和 Jersey 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44438611/