当前位置: 首页 > 知识库问答 >
问题:

ModelMapper将枚举映射到同一枚举时返回null

狄灵均
2023-03-14

我有一个实体,有一个枚举类型字段和一个具有相同枚举类型和字段名的DTO。

@Entity
@Table(name = "user")
public class UserModel {

    @Id
    @GeneratedValue
    private int id;

    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private Gender gender;

    // getters and setters
}

public class UserDto {
    public Gender gender;
}

public enum Gender {
    male,
    female,
    unisex
}

我使用modelMapper创建一个新对象,不需要额外的配置

但在将dto映射到实体对象后,实体对象上的性别为空。

对象有性别,我已经检查了很多。

UserModel user = mapper.map(dto, UserModel.class);
user.getGender(); // null

请帮我理解这个问题。

共有1个答案

吴英武
2023-03-14

你的UserDTO。性别是一个没有干劲的公共领域。另一方面,UserModel。性别是getter的私人领域。

ModelMapper似乎没有混合字段和方法访问,所以您需要通过字段或方法访问这两个方面。

尝试将ModelMapper配置为读/写私有字段,以便不使用getter

ModelMapper mm = new ModelMapper();
mm.getConfiguration()
    .setFieldMatchingEnabled(true)
    .setFieldAccessLevel(AccessLevel.PRIVATE);

另一个选项是声明你的UserDto。性别private,这是一个好办法。

 类似资料:
  • 首先,这就是为什么这个问题不是重复的: 我知道在SO上已经问了很多关于将一个转换为另一个的问题,我甚至自己回答了其中一个问题,但是我在这个主题上发现的所有问题都有一些比较不同枚举值的方法(无论是通过名称还是按价值)。在我的特殊情况下,我不知道值,名字也不匹配。 作为我正在做的一个名为ADONETHelper的GitHub项目的一部分,该项目旨在最大限度地减少与Ado一起工作时的代码重复。Net中,

  • 问题内容: 我需要预先将未实现接口的枚举映射到现有数据库,该数据库使用将该枚举存储在与所有者类相同的表中。 在这种情况下应如何处理映射?持久化到数据库不会改变,因为实现该接口的所有枚举都将具有不同的值,但是我不确定应如何从数据库中检索对象(我是否需要自定义映射器,它将尝试实例化一个使用指定的enum类进行枚举吗?Hibernate本身是否支持此功能?)。 问题答案: 可以创建一个自定义(例如thi

  • 问题内容: Hibernate提供的注释支持使用或的两种类型的映射。当我们使用映射时,它使用的“名称” 而不是Enum的表示形式。在数据库列仅包含一个字符的情况下,这是一个问题。例如,我有以下枚举: 当我坚持枚举使用,即hibernate尝试在数据库中存储的值是开放的。但是,我的数据库列仅包含一个字符,因此会引发异常。 克服这个问题的一个办法是改变枚举类型持有单个字符(如,代替,)。但是,这降低了

  • 问题内容: 假设我有这个枚举: 通过以下映射: 枚举被发送到数据库,,。我希望这些值改为存储为,或存储在varchar列中。 如何将枚举映射到varchar列? 问题答案: 将其添加为EnumType的参数: 这是因为等效于java.sql.Types.VARCHAR

  • 问题内容: 我需要预先将没有实现接口的枚举映射到现有数据库,该数据库使用将该枚举存储在与所有者类相同的表中。 在这种情况下应如何处理映射?持久化到数据库不会改变,因为实现该接口的所有枚举都将具有不同的值,但是我不确定应如何从数据库中检索对象(我是否需要自定义映射器,它将尝试实例化一个使用指定的enum类进行枚举吗?Hibernate是否本身支持此功能?)。 问题答案: 可以创建一个自定义(例如th