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

如何使用Mapstruct克服命名冲突

公孙成仁
2023-03-14

我的映射器:

@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface HoursLocRecord_to_MasterHoursDtoMapper extends StandardMapper<HoursLocRecord, MasterHoursDto> {
        @Mapping(source = "totalOperatingHours.value", target = "totalHours")
        @Mapping(source = "trigger.value", target = "trigger")
        MasterHoursDto map(HoursLocRecord data);
public class HoursDto implements IAssetInfo, Serializable {
  private Double totalHours;
  private Long trigger;
}
public class HoursLocRecord implements Serializable {
  protected ParsedDecimal totalOperatingHours;
  protected ParsedUnsignedShort trigger;
}

parsedunsignedshort

public class ParsedUnsignedShort {
  protected int value;
}

所以你可以在上面看到触发器在“源”中是一个ParsedUnsignedShort,在“目标”中是一个Long。在我得到这个的时候,有一个名字冲突:

错误:(42,6)Java:无法将属性“cat.tmatic.mh.domain.pl6xx.ParseDunSignedShort触发器”映射到“java.lang.Long触发器”。考虑声明/实现一个映射方法:“java.lang.Long map(cat.tmatic.mh.domain.pl6xx.ParseDunSignedShort value)”。

奇怪的是我没有映射那两个!我将trigger.value映射到trigger。我想我得到了一个名字冲突,但无法克服它。我们不得不重命名一个变量来克服这个问题,但mapstruct一定比这更聪明。救命啊!

感谢下面的Rohan Bhattacharya,我在没有扩展的StandardMapper.class(他没有使用它)的情况下重做了我的测试。它编译了。

public interface StandardMapper<From, To> {

  /**
   * Maps from one object to another.
   */
  To map(From from);

  /**
   * Update the object.
   */
  To update(From from, @MappingTarget To to);
}

然后我把它重新连接起来,删除了'update'方法和bam,它编译了。显然,当使用@MappingTarget注释时,我会得到上面的错误。生成的代码必须尝试使用/创建相同的方法,我得到了MappingError。因为我不需要'update',我可以删除它并将其称为closed,但我认为这仍然是Mapstruct中的一个bug。

共有1个答案

杜阳炎
2023-03-14

如果我理解正确的话,您实际上创建了一个映射器,如下所示(注意,扩展缺失):

@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface HoursLocRecord_to_MasterHoursDtoMapper  {

        //  your overriden method To map(From from);
        @Mapping(source = "totalOperatingHours.value", target = "totalHours")
        @Mapping(source = "trigger.value", target = "trigger")
        MasterHoursDto map(HoursLocRecord data);

        // no mappings defined here, so MapStruct will try to generate
        // those missing mapping based on name similarity.
        MasterHoursDto update(HoursLocRecord from, @MappingTarget MasterHoursDto to);

如果希望继续使用基类,可以执行如下操作:

@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface HoursLocRecord_to_MasterHoursDtoMapper extends StandardMapper<HoursLocRecord, MasterHoursDto> {
        @Mapping(source = "totalOperatingHours.value", target = "totalHours")
        @Mapping(source = "trigger.value", target = "trigger")
        MasterHoursDto map(HoursLocRecord data);

        @InheritConfiguration // tell MapStruct to apply the same mappings as the method above with the same source / target
        MasterHoursDto update(HoursLocRecord from, @MappingTarget MasterHoursDto to);

 类似资料:
  • 我的服务器上有一个语音频道,用来显示日期,我正在创建一个机器人,它应该每分钟更新一次。我有问题让机器人重命名机器人,因为我不是很有经验discord.py.这是代码: 任何帮助都将不胜感激。

  • 问题内容: 我正在使用扫描仪的方法读取文本文件行。但是,当我在文件行中达到一定大小时,扫描仪不再允许我读取它,而是返回一个空行。 我应该如何配置缓冲区以接收大量数据? 只是一个文件,行中有许多整数,并用空格分隔。例如,一行中有40000个整数。(请注意,它适用于小于或等于10000整数的文件行,但不适用于40000) 234 544 765 45 34 67 67 87 98 43 [… n =

  • 问题内容: 我正在尝试通过React应用程序中的Redux动作和reducers进行api调用。 但是,我的浏览器出现了这个CORS问题。 我想知道我是否可以从客户端解决此问题,因为我内部没有对API的任何访问权限。 谁能帮我解决这个问题? 这是newsActions.js的代码: 这是server.js的代码: 如果您需要其他信息或有疑问,请在下面对其进行评论。 谢谢。 问题答案: 您可以通过将

  • 我有一个对象,其中包含几个列表。有没有一种方法来克隆这个对象,没有id使用mapstruct,即使是嵌套的对象列表,以自动的方式能够持久化它。 实际制图员 有没有一种方法可以忽略所有id,而不必对每个列表进行@Mapping(target=“id”,ignore=true)?

  • 刚刚开始使用scala和spark来运行这个简单的程序:

  • 在实现第三方API(mollie)时,他们似乎将支持分页的参数之一命名为from,这与内置的python相冲突。 有没有办法让我正确使用这个?我没有正确传递参数吗?注意:它们被写成。 它唯一支持的参数是:和。 给予: