假设以下类别:
public class Address {
public String street;
...
}
public class Contact {
public String boulevard;
...
}
public class Partner {
private final List<Address> addresses = new ArrayList<Address>();
public List<Address> getAddresses() {
return addresses;
}
}
public class Person {
private final ArrayList<Contact> contacts = new ArrayList<Contact>();
public ArrayList<Contact> getContacts() {
return contacts;
}
//public void setContacts(List<Contact> contacts) {
public void setContacts(List contacts) {
/// ...
}
}
这只是用于说明的旧版代码的简化虚拟示例。
这是映射器:
@Mapper
public abstract class PartnerToPersonMapper {
@BeanMapping(ignoreByDefault = true)
@Mapping(source="addresses", target = "contacts", qualifiedByName = "mapAddresses")
public abstract void mapTo(Partner partner, @MappingTarget Person person);
@Named("mapAddresses")
List<Contact> mapAddresses(List<Address> addresses) {
// some complex mapping here
}
}
因此,如果按原样运行代码,则会得到映射器的实现,如:
...
if ( person.getContacts() != null ) {
List<Address> list = partner.getAddresses();
if ( list != null ) {
person.getContacts().clear();
person.getContacts().addAll( list );
}
else {
person.setContacts( null );
}
}
else {
List<Address> list = partner.getAddresses();
if ( list != null ) {
person.setContacts( new ArrayList( list ) );
}
}
...
要注意的是,@Named
方法根本没有被mapstruct使用。
如果使用注释行public void setContacts(List<Contact> contacts)
,即getter和setter的签名类型相同,则一切正常(mapstruct使用@Named
方法):
...
if ( person.getContacts() != null ) {
List<Contact> list = mapAddresses( partner.getAddresses() );
if ( list != null ) {
...
问题是:假设我必须为getter和setter使用具有不同签名类型的类,因为我无法更改旧版代码。
是否有一种方法可以强制mapstruct始终应用@Named
方法(不管不同的getter / setter签名类型如何)?
作为唯一的解决方法,我可以使用@AfterMapping,但我希望会有一些更简单的方法-最好是@Named
并为mapstruct进行一些额外的配置。
谢谢!
答案 0 :(得分:1)
您可以在@Mapping中使用表达式来严格使用自己的映射方法