如何使用 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。
我想要映射 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。