0

我正在尝试将具有一些 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 中尝试过类似的事情。我在映射器接口中定义了personcalCustomerToPersonalCustomermethod,其中包含必需的映射并忽略了不需要的字段。尽管 mapperImpl 中有实现,但我没有看到它在 impl 类中的任何地方使用。

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

    [70,2] 错误:结果类型 com.role.Customer 中的未知属性“amlLineOfBusiness”。您指的是 “lineOfBusiness” 吗?[ERROR] -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: 无法执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.5.1:compile (default-compile) on project service -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. 默认情况下,mapStruct 也是超类的映射字段。在我的例子中,Customer 类也获得了 Role 的属性。除了在每个属性上使用 ignore=true 之外,没有其他选择。这有点忙,因为根据服务要求,我有 50 个奇怪的字段和数十个类似的映射器。我希望 mapStruct 具有默认忽略所有字段的功能或仅映射指定字段的策略。

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

4

1 回答 1

2

看起来你有3个不同的问题。

  1. 看来您想要实现的是 MapStruct 检测所有可能的实现Customer(或参见@XmlSeeAlso)并使用您需要的方法。这在 MapStruct 中是不可能自动实现的。有关现有功能请求,请参见 #131 。
  2. 当您没有正确定义属性时,应该会发生这种情况。MapStruct 实际上只查看 getter 和 setter(不在现场)。因此,如果您是吸气剂,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 正在处理运行时信息。Dozer 可以在运行时获取类并选择正确的方法。MapStruct 不能推导出所有可能的实现。

于 2018-03-30T11:17:31.983 回答