【问题标题】:Convert entities with ModelMapper使用 ModelMapper 转换实体
【发布时间】:2021-06-15 13:50:17
【问题描述】:

源实体和目标实体在字段命名样式上有所不同(一种是下划线,另一种是驼峰式)。 所以,来源:

 public class User {
    private String first_name;
}

目的地:

public class UserDto {
    private String firstName;
}

我的任务是通过 ModelMapper 自动转换实体 - 无需处理字段映射(通过 getter-setter)。

为此,我尝试如下配置映射器:

 ModelMapper modelMapper = new ModelMapper();
    modelMapper.getConfiguration()
            .setSourceNameTokenizer(NameTokenizers.UNDERSCORE);
        

但这不起作用

【问题讨论】:

  • 通过反射的私有访问在 Java 17 及后续版本中存在问题。如果您想避免编写样板代码,只需在您的类上使用来自 Lombok 的 @Getter@Setter 注释。或者,如果您只想访问某些私有字段:在单个字段变量上。

标签: java modelmapper


【解决方案1】:

默认情况下,field matching is disabled,因此您必须更改配置中的标志。由于您的字段是私有的,您还必须将它们包含在您的设置中:

modelMapper.getConfiguration()
    .setFieldMatchingEnabled(true)
    .setFieldAccessLevel(AccessLevel.PRIVATE);

【讨论】:

  • 好吧,PRIVATE 很可能无法与 Java 17(大公司使用的最新 LTS 版本)一起使用。所以你将不得不使用getter和setter。我为此推荐 Lombok @Getter 和 @Setter Annotations。
【解决方案2】:

作为M. Dudekalready correctly answered,如果您不想使用getter/setter,则需要单独启用字段访问。

但为了让它双向工作,您还需要 setDestinationNameTokenizer

modelMapper.getConfiguration()
    .setSourceNameTokenizer(NameTokenizers.UNDERSCORE)
    .setDestinationNameTokenizer(NameTokenizers.UNDERSCORE)
    .setFieldMatchingEnabled(true)
    .setFieldAccessLevel(AccessLevel.PRIVATE);

如果愿意使用 getter/setter,那么这就足够了:

modelMapper.getConfiguration()
    .setSourceNameTokenizer(NameTokenizers.UNDERSCORE)
    .setDestinationNameTokenizer(NameTokenizers.UNDERSCORE):

【讨论】:

  • 但在@Andrew 的情况下,目标类没有UNDERSCORE 格式的字段,因此您的解决方案不适用于他。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多