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

Java 8 如何将Java8可选与Moxy和Jersey一起使用,java-8,jersey,moxy,Java 8,Jersey,Moxy,是否可以将Jersey与Moxy一起用于Json和Java8选项 如何配置它?您可以声明以下类: public class OptionalAdapter<T> extends XmlAdapter<T, Optional<T>> { @Override public Optional<T> unmarshal(T value) throws Exception { return Optional.ofNullab

是否可以将Jersey与Moxy一起用于Json和Java8选项


如何配置它?

您可以声明以下类:

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);
    }

}
但这里有一些缺点:

  • 上面的适配器只能处理简单类型,如Integer、String等,默认情况下可以由MOXY解析
  • 您必须显式地指定
    @xmlement(type=Integer.class)
    以告知解析器类型正在使用,否则
    null
    值将传递给适配器的
    unmarshal
    方法
  • 您错过了为自定义类型使用适配器的机会,例如,基于某个日期格式字符串的
    java.util.Date
    类的自定义适配器。要解决这个问题,您需要创建类似于
    类OptionalDateAdapter扩展XmlAdapter
    的适配器
  • 此外,不建议在字段上使用
    可选
    ,有关详细信息,请参阅

    考虑到以上所有因素,我建议只使用
    可选
    作为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;
        }
    
    }
    
    @XmlRootElement
    公开课{
    @XmlElement
    私有整数id;
    公共可选getId(){
    返回可选的可空值(id);
    }
    公共无效集合id(整数id){
    this.id=id;
    }
    }
    
    AFAIK您需要一个自定义适配器来处理这个问题。是否没有作为maven依赖项的插入式jar?我很确定我不是第一个遇到这个问题的人。我还想问一下如何为一个可选的、通用的。。。。如果这是解决方案的一部分。
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlJavaTypeAdapters({
            @XmlJavaTypeAdapter(type = Optional.class, value = OptionalAdapter.class)
    })
    
    @XmlRootElement
    public class SampleRequest {
    
        @XmlElement
        private Integer id;
    
        public Optional<Integer> getId() {
            return Optional.ofNullable(id);
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
    }