【问题标题】:How convert string field to hashmap value with mapstruct java?java - 如何使用mapstruct java将字符串字段转换为hashmap值?
【发布时间】:2021-12-05 15:15:20
【问题描述】:

我想用 ma​​pstrcutaccountNo 映射到带有特定键(我的意思是 hashmap 的键)的 argument 值。有什么想法吗?

事件是我的目标

    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

【问题讨论】:

    标签: java spring spring-boot mapstruct


    【解决方案1】:

    目前没有开箱即用的支持从 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() 为空,使用它可以避免潜在的 NPE。

    【讨论】:

    • 谢谢,@Filip 您提到了重要的点,非常感谢。
    【解决方案2】:

    为什么不使用默认映射器。比如:

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

    【讨论】:

    • 我正在寻找带有注释的map-struct方式,但我认为映射Map是不可能的。
    • 然后您需要创建一个函数将 String 转换为 Map,在那里定义源和目标,然后您已经定义的函数会自动选择该函数:accountRequestToEvent @Faramarz-Afzali
    • 感谢您的帮助 Hosein。
    猜你喜欢
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 2021-04-14
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多