使用@Named映射到getter和setter签名类型不同的对象的Mapstruct映射集合

时间:2019-12-10 10:09:22

标签: java mapstruct

假设以下类别:

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进行一些额外的配置。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以在@Mapping中使用表达式来严格使用自己的映射方法