【问题标题】:Can't map property String to JAXBElement<String> using MapStruct无法使用 MapStruct 将属性字符串映射到 JAXBElement<String>
【发布时间】:2018-02-11 08:36:40
【问题描述】:

所以我玩了一点 Mapstruct,阅读了 1.1.0.Final 版本的参考文档,并达到了这一点: implicit type conversions

其中定义如下语句:

在 JAXBElement 和 T 之间

我试过了,但收到的错误是:

Can't map property "java.lang.String xmlElement" "javax.xml.bind.JAXBElement<java.lang.String> xmlElement". 
Consider to declare/implement a mapping method:
javax.xml.bind.JAXBElement<java.lang.String> map(java.lang.String value)".

我知道 thisi 和Can't map property when using MapStruct 是同一个线程,但从那时起 Mapstruct 发布了一个新版本。

是我做错了什么还是真的缺少这个功能?

谢谢。

【问题讨论】:

    标签: mapstruct jaxbelement


    【解决方案1】:

    如果您的 JAXBElement 是由 wsdl 客户端生成器(例如 xjc)生成的,您需要提供客户端生成器生成的相应 ObjectFactory.class:

    @Mapper(uses = ObjectFactory.class)
    public interface OrderMapper {
        Order orderEntityToExternalOrder(OrderEntity orderEntity);
    }
    

    见: MapStruct 1.0.0.Beta1 is out with JAXB support, custom factories, decorators and more

    【讨论】:

      【解决方案2】:

      如果在 Java 9 或更高版本上发生这种情况,并且您使用来自 maven 库的 JAXBElement 类型的实现(在我的情况下为'javax.xml.bind:jaxb-api'),请确保它位于注释处理器的类路径中 - 这为我解决了问题。

      【讨论】:

      • 如何在 Gradle 中为注解处理器指定 javax.xml.bind 等的类路径?
      • 将依赖项添加到 compileOnly 或像这样编译配置 - compileOnly('...')compile('...') 其中 ... 是您的库。
      【解决方案3】:

      JAXBElement&lt;T&gt;T 的映射开箱即用。相反,您需要确保ObjectFactory(ies) 在Mapper#uses 中,MapStruct 使用这些方法来创建类型。

      你也可以看看this集成测试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-12
        • 2018-11-10
        • 2019-07-03
        • 1970-01-01
        • 2020-12-27
        相关资源
        最近更新 更多