我想使用特定鍵(我的意思是 hashmap 的鍵)映射accountNo到argument值,使用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
uj5u.com熱心網友回復:
為什么不使用默認映射器。就像是:
default Event accountRequestToEvent(AccountRequest accountRequest) {
Event event = new Event();
event.setArguement(Collections.singletonMap(accountRequest.getAccountNo(), "value"));
return event;
}
uj5u.com熱心網友回復:
目前沒有對從 Bean 映射到 Map 的開箱即用支持。但是,此功能有一個開放的功能請求。
這意味著對于您的示例,您需要在自定義映射中執行此操作。
例如
@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()為空,您將避免潛在的 NPE 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/326750.html
上一篇:以反應方式一次發送一個物件串列
下一篇:有沒有一種方法可以使用QueryBuilder將Map<String,Object>插入到Cassandra表中以獲取動態表(沒有模型類的表)
