如何使用MapStruct映射带有@XmlSeeAlso注解的JAXB元素?
处理带JAXB注解的Bean映射(MapStruct场景)
看起来你是在用MapStruct来映射带有JAXB注解的Customer类对吧?这类场景下需要注意几个关键点,我给你梳理一下:
1. 确保MapStruct识别JAXB注解
MapStruct默认支持JAXB注解,但得先把依赖配对。如果用Maven,要确保mapstruct-jaxb已经引入:
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-jaxb</artifactId> <version>${mapstruct.version}</version> </dependency>
2. 处理@XmlSeeAlso的子类映射
因为Customer用@XmlSeeAlso指定了PersonalCustomer和BusinessCustomer两个子类,映射时得让MapStruct知道子类的转换规则。MapStruct 1.5+版本可以用@SubclassMapping简化配置,老版本则需要为每个子类单独写映射方法:
@Mapper public interface CustomerMapper { CustomerMapper INSTANCE = Mappers.getMapper(CustomerMapper.class); // 基础Customer到DTO的映射 CustomerDto customerToCustomerDto(Customer customer); // 子类专属映射,指定源类型和目标类型 @SubclassMapping(source = PersonalCustomer.class, target = PersonalCustomerDto.class) @SubclassMapping(source = BusinessCustomer.class, target = BusinessCustomerDto.class) CustomerDto customerToCustomerDto(Role customer); // 用父类Role作为参数,兼容子类传入 // 如果需要反向映射,同样为子类单独定义 PersonalCustomer personalCustomerDtoToPersonalCustomer(PersonalCustomerDto dto); BusinessCustomer businessCustomerDtoToBusinessCustomer(BusinessCustomerDto dto); }
3. 适配@XmlElement和@XmlSchemaType注解
- 对于
@XmlElement:MapStruct默认按字段名/ getter/setter匹配,如果你想严格遵循JAXB指定的元素名(比如字段amlLineOfBusiness对应XML元素AMLLineOfBusiness),要么让DTO的字段名和XML元素名一致,要么用@Mapping手动指定对应关系:
@Mapping(target = "amllLineOfBusiness", source = "amlLineOfBusiness") CustomerDto customerToCustomerDto(Customer customer);
- 对于
@XmlSchemaType:它主要影响XML序列化的类型格式,一般不影响对象间的属性映射。如果涉及日期、时间这类特殊类型转换,MapStruct会自动处理,特殊场景可以自定义类型转换器。
4. 简化大量属性的映射
你的Customer有近50个属性,手动写@Mapping太繁琐。MapStruct会自动匹配同名字段,只要DTO的字段名和Customer的字段名(或JAXB元素名)一致,就无需手动配置;只有少量字段名不一致时,再单独添加@Mapping即可。另外,父类Role的属性也会被自动纳入映射,不需要额外配置。
内容的提问来源于stack exchange,提问作者Naveen
相关产品推荐
相关产品推荐

