java-8 - 如何将 Java 8 可选与 Moxy 和 Jersey 一起使用

标签 java-8 jersey moxy

是否可以将 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)
})

但这里有一些缺点:

  1. 上面的适配器只能处理简单类型,例如 Integer、String 等,默认情况下 MOXY 可以解析这些类型。
  2. 您必须指定@XmlElement(type = Integer.class)显式告诉解析器类型正在使用,否则 null值将传递到适配器的 unmarshal方法。
  3. 您错过了使用自定义类型适配器的机会,例如定制适配器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/

相关文章:

java - 连接列表中所有 map 的字符串值

java - Jersey @Path 注释在类级别是必需的

Java Jersey JSON 服务不返回带引号的字符串?

mysql - 在 Restful Web 服务中使用 Hibernate 的 SQL 查询

java - JAXB 是否可以将两个或多个元素编码到一个域对象字段中?

postgresql - eclipselink + @convert(json) + postgres + 列表属性

java - 如何编码/取消编码 Map<Integer, List<Integer>>?

Java Stream_Don't apply filter if my filter string is null

java - 使用 Integer foo(String s) 将 List<String> 转换为 List<Integer>

java - 无效的 Lambda 表达式