我正在尝试映射一个具有一些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映射时,我面临以下问题。
Bean PersonalCustomer没有被映射。我没有在回复中看到它。但是在使用推土机时它可以完美地工作。我需要做的就是在dozer config xml中的映射中定义它。我在mapStruct中尝试过类似的事情。我在mapper界面中使用必需的映射定义了personcalCustomerToPersonalCustomer方法,并忽略了不需要的字段。虽然mapperImpl中有实现,但是我看不到它在impl类中的任何地方使用。
忽略具有@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 .internal.MojoExecutor。
当我使用(@XmlElement(name =“ AMLLineOfBusiness”))批注的名称值忽略时,以上问题得以解决。我不明白这里到底发生了什么。
请注意,此处的源类型和目标类型都是相同的。我只需要根据要求映射某些字段。我被困在这里。非常感谢您的帮助。
看来您有3个不同的问题。
Customer
@XmlSeeAlso
getAM
@Mapping(target = "AMLLineOfBusiness", ignore = true)
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无法推断所有可能的实现。