繁体   English   中英

如何使用mapStruct映射以@XMLSeeAlso注释的JAXB元素?

[英]How to map JAXB elements annotated with @XMLSeeAlso using mapStruct?

我试图映射一个具有一些JAXB元素(如@ XmlSeeAlso,@ XmlElement,@ XmlSchemaType)作为该类属性的bean。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Customer")
@XmlSeeAlso({PersonalCustomer.class, BusinessCustomer.class})
public class Customer extends Role {

 @XmlElement(name = "AMLLineOfBusiness")
private LOB amlLineOfBusiness;
 // 50 odd properties
 //some properties with XmlElement/XmlSchemaType 
 // getters and setters   
}

@Mapper
public interface CustomerMapper {
     PersonalCustomer personcalCustomerToPersonalCustomer(PersonalCustomer pc);
@Mappings({
    /*Several other ignore mappings*/
    @Mapping(target="AMLLineOfBusiness",ignore=true)
    })
     Customer customerToCustomer(Customer customer);
   }

现在,当使用mapStruct映射时,我面临以下问题。

  1. Bean PersonalCustomer没有被映射。 我没有在回复中看到它。 但是,在使用推土机时,它可以完美工作。 我需要做的就是在dozer config xml中的映射中定义它。 我在mapStruct中尝试了类似的事情。 我在mapper界面中使用必需的映射定义了personcalCustomerToPersonalCustomer方法,并忽略了不需要的字段。 虽然mapperImpl中有实现,但是我看不到它在impl类中的任何地方使用。

  2. 忽略具有@XmlElement或@XmlSchemaType的字段时,在生成impl代码时遇到编译错误。 下面是错误statck跟踪。 使用amlLineOfBusiness时出现编译错误。

    [70,2]错误:结果类型com.role.Customer中的未知属性“ amlLineOfBusiness”。 您是说“ lineOfBusiness”吗? [错误]-> [帮助1] org.apache.maven.lifecycle.LifecycleExecutionException:无法在项目服务上执行目标org.apache.maven.plugins:maven-compiler-plugin:3.5.1:compile(默认编译) -jar:编译失败C:\\ Perforce \\ service-jar \\ 2018.08.0 \\ service-jar \\ src \\ main \\ java \\ com \\ mapstruct \\ mapper \\ CustomerMapper.java:[70,2]错误:未知属性“ amlLineOfBusiness”在结果中键入com.role.Customer。 您是说“ lineOfBusiness”吗? 在org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)在org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)在org.apache.maven.lifecycle org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:108)上的.internal.MojoExecutor.execute(MojoExecutor.java:145)在org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder的$ 1.call(MultiThreadedBuilder.java:188)在java.util.concurrent.FutureTask.run(FutureTask.java)的$ 1.call(MultiThreadedBuilder.java:184) :266)在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511)在java.util.concurrent.FutureTask.run(FutureTask.java:266)在java.util.concurrent.ThreadPoolExecutor.runWorker( C.java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)中的ThreadPoolExecutor.java:1149)java.lang.Thread.run(Thread.java:748)中的ThreadPoolExecutor.java:1149)C 使用者:org.apache.maven.plugin.compiler.CompilationFailureException:编译失败

    当我使用(@XmlElement(name =“ AMLLineOfBusiness”))批注的名称值忽略时,以上问题得以解决。 我不明白这里到底发生了什么。

  3. 默认情况下,mapStruct也映射超类的字段。 就我而言,Customer类也获得Role的属性。 除了在每个属性上使用ignore = true外,没有其他选择。 这有点忙,因为根据服务需求,我有50个奇数字段和数十个类似的映射器。 我希望mapStruct具有默认情况下忽略所有字段的功能或仅映射指定字段的策略。

请注意,此处的源和目标类型相同。 我只需要根据要求映射某些字段。 我被困在这里。 非常感谢您的帮助。

看来您有3个不同的问题。

  1. 看来您要实现的目标是让MapStruct检测到Customer所有可能的实现(或参阅@XmlSeeAlso )并使用所需的方法。 这在MapStruct中是不可能自动实现的。 有关现有功能请求,请参见#131
  2. 当您没有正确定义属性时,应该会发生这种情况。 实际上,MapStruct仅查看getter和setter(不在字段中)。 因此,如果您的getter是getAM则您的@Mapping(target = "AMLLineOfBusiness", ignore = true)
  3. 这个问题与类似。 也许您可以尝试重用映射配置

1的可能解决方案是将您放在您身边的一个实例上。

@Mapper
public interface CustomerMapper {
    PersonalCustomer personcalCustomerToPersonalCustomer(PersonalCustomer pc);

    default Customer customerToCustomer(Customer customer) {
        if (customer instanceOf PersonalCustomer) {
            return personalCustomerToPersonalCustomer((PersonalCustomer) pc);
        } else if (customer instanceOf BusinessCustomer) {
            return businessCustomerToBusinessCustomer((BusinessCustomer) pc);
        }
    }
}

发生这种情况的原因是MapStruct是注释处理器,因此它在编译期间生成了代码。 另一方面,Dozer正在处理运行时信息。 推土机可以在运行时获取类并选择正确的方法。 MapStruct无法推断所有可能的实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM