【问题标题】:Does Dozer allow converting from Enum to Enum?Dozer 是否允许从 Enum 转换为 Enum?
【发布时间】:2017-05-04 11:36:54
【问题描述】:

2 个枚举:

enum Source {

    WINTER,
    SPRING,
    SUMMER,
    AUTUMN
}

enum Dest {

    WINTER,
    SPRING,
    SUMMER,
    AUTUMN
}

尝试使用DozerSource 转换为Dest

DozerBeanMapper mapper = new DozerBeanMapper();

mapper.map(Source.WINTER, Dest.class);

线程“主”org.dozer.MappingException 中的异常: java.lang.NoSuchMethodException: Dest.()

但是当我尝试转换包含上述枚举的复杂对象时,Dozer 成功地转换了它。

那么,当 Enum 不是复杂对象的属性时,为什么 Dozer 不能将 Enum 转换为 Enum?

【问题讨论】:

    标签: java enums dozer


    【解决方案1】:

    Dozer 无法映射枚举,因为它依赖于默认无参数公共构造函数的存在。只有当它们是更大 POJO 的一部分时,它们才能被映射。例如:

    enum Source {
    
        WINTER,
        SPRING,
        SUMMER,
        AUTUMN
    }
    
    public class SourceClass{
    
      private Source season;
    
      public Source getSeason() {
        return season;
      }
    
      public void setSeason(Source season) {
        this.season = season;
      }
    
    }
    

    enum Dest {
    
        WINTER,
        SPRING,
        SUMMER,
        AUTUMN
    }
    
    public class DestClass{
    
      private Dest season;
    
      public Dest getSeason() {
        return season;
      }
    
      public void setSeason(Dest season) {
        this.season = season;
      }
    
    }
    

    现在这将起作用:

    SourceClass source = new SourceClass();
    source.setSeason(Source.AUTUMN);
    
    DestClass dest = mapper.map(source, DestClass.class);
    

    【讨论】:

      【解决方案2】:

      作为替代方案,如果您的枚举共享相同的命名,您可以这样做:

      Dest mapped = Dest.valueOf(Source.WINTER.toString);
      

      但是请注意,如果其中一个枚举条目被重命名,您将失去类型安全性,并且您的编译器不会警告您。

      【讨论】:

        猜你喜欢
        • 2017-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-09
        • 2016-02-05
        相关资源
        最近更新 更多