推土机是否允许从Enum转换为Enum?

时间:2017-05-04 11:36:54

标签: java enums dozer

2个枚举:

enum Source {

    WINTER,
    SPRING,
    SUMMER,
    AUTUMN
}

enum Dest {

    WINTER,
    SPRING,
    SUMMER,
    AUTUMN
}

尝试使用SourceDest转换为Dozer

DozerBeanMapper mapper = new DozerBeanMapper();

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

线程中的异常" main" org.dozer.MappingException:   java.lang.NoSuchMethodException:Dest。< init>()

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

或者,如果您的枚举使用相同的命名,则可以执行以下操作:

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

但是请注意,如果两个枚举项中的任何一个都被重命名,那么您将失去类型安全性,并且编译器不会警告您。