当前位置: 首页 > 知识库问答 >
问题:

如何映射JAXB元素注释@XMLSee还使用mapSTRt?

寿卜鹰
2023-03-14

我试图映射一个bean,其中包含一些JAXB元素,如@XmlSee同样、@XmlElement、@XmlschemaType作为该类的属性。

@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);
   }

现在,我面临着下面的问题时,使用mapSTRt映射。

>

  • bean个人客户没有被映射。我没有在响应中看到它。但是当使用dozer时,它工作得很好。我所需要做的就是在dozer配置xml中的映射中定义它。我在mapSTRt中尝试了类似的事情。我在mapper接口中定义了个人定制的方法,需要映射,忽略不需要的字段。虽然在mapperImpl中有实现,但是我没有看到它在impl类的任何地方被使用。

    忽略@XmlElement或@XmlschemaType字段时,我在生成impl代码时遇到编译错误。下面是错误状态跟踪。当我使用amlLineOfBusiness时,我遇到了编译错误。

    [70,2]错误:结果类型中的未知属性“amlLineOfBusiness”com.role.客户。你是说“lineOfBusiness”吗?[错误]-

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

    默认情况下,mapStruct也映射超类的字段。在我的例子中,Customer类还获得了Role的属性。除了在每个属性上使用ignore=true之外,没有其他选项。这是一种忙碌,因为我有50多个领域和几十个类似的地图根据服务要求。我希望mapStruct有一个默认忽略所有字段的功能,或者有一个只映射指定字段的策略。

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

  • 共有1个答案

    马淇
    2023-03-14

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

    1. 看起来您要实现的是让MapSTRt检测客户的所有可能的实现(或参见@XmlSeeAnd),并使用您需要的方法。这在MapSTRt中是不可能自动实现的。有关现有功能请求,请参见#131。
    2. 当您没有正确定义属性时,就会发生这种情况。实际上,MapSTRt只查看getter和setters(不在字段中)。因此,如果getter是getAM,那么您的@映射(目标="AMLLineOfBusiness",忽略=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无法推断所有可能的实现。

     类似资料:
    • 问题内容: 我正在尝试映射一个具有一些JAXB元素(如@ XmlSeeAlso,@ XmlElement,@ XmlSchemaType)作为该类属性的bean。 现在,当使用mapStruct映射时,我面临以下问题。 Bean PersonalCustomer没有被映射。我没有在回复中看到它。但是在使用推土机时它可以完美地工作。我需要做的就是在dozer config xml中的映射中定义它。我

    • 问题内容: 我有一个类似的xml: 我想将元素映射到类MyBean中的属性 有什么办法可以做到吗?我正在使用JDK 1.6随附的jaxb 问题答案: 注意: 我是 EclipseLink JAXB(MOXy)的 负责人,并且是 JAXB(JSR-222) 专家组的成员。 使用任何JAXB(JSR-222)实现 使用任何JAXB(JSR-222)实现,您都可以使用来映射此用例。 ThetaValue

    • 如何使用杰克逊序列化此类 Jackson没有拾取@XmlElementWrapper@XmlSee还有注释,Jackson也没有映射@XmlRootElement注释。我使用的是Jackson 1.9.0。Jackson正在将元素放入列表中,但没有映射POJO类的根元素。 这里是示例方法。 它生成的响应是'{“response”:{“status”:0,“PBBeans”:[{“user_name

    • 我有许多带有JAXB注释的实体,我希望使用消息转换器将它们转换为JSON。 我知道我的ObjectMapper可以读取JAXB注释: 但是当我调用rest服务时,默认的注册MappingJacksonHttpMessageConverter(它不是为读取JAXB而配置的)似乎会接管--当忽略@XMLTransient时,由于循环引用而导致stackoverflow... 如何配置Spring来使用

    • 对于下面的Page对象示例类,我有一个accountsLink私有成员,它在加载时映射到登录页面上的非动态元素。当从构造函数调用initElements方法时,使用FindBy批注对其进行初始化。 现在问题来了。我有另一个元素(signInButton),它只在您单击accountsLink元素时才动态加载。此操作不会将您带到另一个页面,而只会打开一个ajax菜单,其中会出现登录按钮。 我的问题是