如何使用 mapstruct java 将字符串字段转换为 hashmap 值?

How convert string field to hashmap value with mapstruct java?

我想要映射 accountNo 到具有特定键的 argument 值(我的意思是 hashmap 的键),使用 mapstrcut。有什么想法吗?

事件是我的目标

    private Map<String, Object> argument;
    private LocalDateTime dateTime;

AccountRequest 是我的来源

    private String accountNo;
    private LocalDateTime dateTime;

我有下面的映射器,但我也想要相反的映射器。

    @Mapping(target = "accountNo", expression = "java(event.getArgument().get(key).toString())")
    AccountRequest eventToAccountRequest(Event event, String key);

    Event accountRequestToEvent(AccountRequest accountRequest); // this is my question

为什么不使用默认映射器。类似于:

default Event accountRequestToEvent(AccountRequest accountRequest) {
    Event event = new Event();
    event.setArguement(Collections.singletonMap(accountRequest.getAccountNo(), "value"));
    return event;
}

目前不支持从 Bean 到 Map 的映射。但是,有一个 open feature 请求此功能。

这意味着对于您的示例,您需要在自定义映射中进行。

例如

    @Mapping(target = "argument", source = "accountNo", qualifiedByName = "accountNoToArgument")
    Event accountRequestToEvent(AccountRequest accountRequest);

    @Named("accountNoToArgument")
    default Map<String, Object> accountNotToArgument(String accountNo) {
        return accountNo == null ? null : Collections.singletonMap("accountNo", accountNo);
    }

这将确保其余参数由 MapStruct 自动映射。


关于 eventToAccountRequest 更好映射的旁注。您可以使用自定义映射方法和 @Context 来改进它,而不是使用表达式。例如

    @Mapping(target = "accountNo", source = "argument", qualifiedByName = "argumentToAccountNo")
    AccountRequest eventToAccountRequest(Event event, @Context String key);

    @Named("argumentToAccountNo"
    default String argumentToAccountNo(Map<String, Object> argument, @Context key) {
        return argument == null : null : argument.get(key).toString();
    }

如果 event.getArgument() 为 null,则使用它可以避免潜在的 NPE。