Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 推土机是否允许从枚举转换为枚举?_Java_Enums_Dozer - Fatal编程技术网

Java 推土机是否允许从枚举转换为枚举?

Java 推土机是否允许从枚举转换为枚举?,java,enums,dozer,Java,Enums,Dozer,2个枚举: enum Source { WINTER, SPRING, SUMMER, AUTUMN } 及 试图使用推土铲将源转换为目标: DozerBeanMapper mapper = new DozerBeanMapper(); mapper.map(Source.WINTER, Dest.class); 线程“main”org.dozer.MappingException中的异常: java.lang.NoSuchMethodException:

2个枚举:

enum Source {

    WINTER,
    SPRING,
    SUMMER,
    AUTUMN
}

试图使用推土铲将
转换为
目标

DozerBeanMapper mapper = new DozerBeanMapper();

mapper.map(Source.WINTER, Dest.class);
线程“main”org.dozer.MappingException中的异常: java.lang.NoSuchMethodException:Dest.()

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


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

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

}

现在这将起作用:

SourceClass source = new SourceClass();
source.setSeason(Source.AUTUMN);

DestClass dest = mapper.map(source, DestClass.class);

作为替代方案,如果您的枚举共享相同的命名,您可以执行以下操作:

Dest mapped = Dest.valueOf(Source.WINTER.toString);
但是请注意,您将失去类型安全性,并且如果重命名任何一个枚举项,编译器将不会警告您

SourceClass source = new SourceClass();
source.setSeason(Source.AUTUMN);

DestClass dest = mapper.map(source, DestClass.class);
Dest mapped = Dest.valueOf(Source.WINTER.toString);