简体   繁体   English

如何将值注入 MapStruct 接口 - java

[英]How to inject a value to a MapStruct interface - java

I have a MapStruct interface that receives a List<> as a parameter which is read from a yaml config file我有一个 MapStruct 接口,它接收一个 List<> 作为参数,该参数是从 yaml 配置文件中读取的

  @Value("${clientType.individual.channelIds}")
  private List<String> validIndividualChannelIds;

I was wondering if there was either a way to retrieve that property from within the MapStruct interace or injected into the interface to avoid having to pass that parameter around to mapClientType() and then to isIndividual()?我想知道是否有一种方法可以从 MapStruct 接口中检索该属性或注入接口以避免必须将该参数传递给 mapClientType() 然后传递给 isIndividual()?

@Mapper(componentModel = "spring", nullValuePropertyMappingStrategy = IGNORE)
public interface TransferMapper {

  @Mapping(source = "headers.requestId", target = "requestId")
  @Mapping(source = "headers.callback", target = "callback")
  @Mapping(source = "headers.agentId", target = "agentId")
  @Mapping(source = "headers.partnerId", target = "partnerId")
  @Mapping(source = "messageId", target = "messageId")
  @Mapping(source = "transferRequest.instructedAmount.amount", target = "amountWithCurrency.amount")
  @Mapping(source = "transferRequest.instructedAmount.currency", target = "amountWithCurrency.currency")
  @Mapping(source = "transferRequest.debtor.identification.organisationIdentification.other.identification", target = "clientId")
  Transfer toTransfer(TransferRequest transferRequest, TransferHeaders headers, UUID messageId, List<String> validIndividualChannelIds);

  @AfterMapping
  default void mapClientType(@MappingTarget Transfer transfer, TransferHeaders headers,
                             TransferRequest transferRequest, List<String> validIndividualChannelIds) {
    if (isIndividual(headers, transferRequest, validIndividualChannelIds)) {
      transfer.setClientType(ClientType.INDIVIDUAL);
    } else {
      transfer.setClientType(ClientType.ORGANISATION);
    }
  }

  default boolean isIndividual(TransferHeaders headers, TransferRequest transferRequest, List<String> validIndividualChannelIds) {
    return validIndividualChannelIds.contains(headers.getChannelId()) ||
            (ChannelType.BATCH.getValue().equals(headers.getChannelType()));
  }

}

Try using an abstract class instead of an interface, and then putting the field inside it.尝试使用abstract class而不是接口,然后将字段放入其中。 That way your isIndividual method can access the field directly.这样您的isIndividual方法就可以直接访问该字段。

For example:例如:

@Mapper(componentModel = "spring", nullValuePropertyMappingStrategy = IGNORE)
public abstract class TransferMapper {

  @Value("${clientType.individual.channelIds}")
  private List<String> validIndividualChannelIds;

  // @Mapping annotations here.
  abstract Transfer toTransfer(TransferRequest transferRequest, TransferHeaders headers, UUID messageId);

  @AfterMapping
  protected void mapClientType(@MappingTarget Transfer transfer, TransferHeaders headers, TransferRequest transferRequest) {
    if (isIndividual(headers, transferRequest)) {
      transfer.setClientType(ClientType.INDIVIDUAL);
    } else {
      transfer.setClientType(ClientType.ORGANISATION);
    }
  }

  private boolean isIndividual(TransferHeaders headers, TransferRequest transferRequest) {
    return validIndividualChannelIds.contains(headers.getChannelId()) ||
            (ChannelType.BATCH.getValue().equals(headers.getChannelType()));
  }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM