MapStruct - 如何忽略 POJO 中不必要的方法/非 getter-setter 方法

Tus*_*rao 2 java mapping list pojo mapstruct

下面是 POJO:

public class TransferObjectListTO {

    private List<A> transferList;

    public List<A> getTransferList() {
        return transferList;
    }

    public void setList(List<A> transferList) {
        this.transferList= transferList;
    }

    public List<A> getList() {
        return getTransferList();
    }

    public void incrementList(List<A> transferList) {
        getTransferList().addAll(transferList);
    }

}
Run Code Online (Sandbox Code Playgroud)

它有一种加法器方法 -

增量列表

以及复制到 getter 方法 -

获取列表

Mapstruct 生成的代码具有以下不必要的内容,其中添加了列表,再次添加了源类型:

if ( targetTypeTransferObjectListTO.getList() != null ) {
    List sourceTypeList = sourceTypeTransferObjectListTO.getList();
    if ( sourceTypeList != null ) {
        targetTypeTransferObjectListTO.getList().addAll( sourceTypeList );
    }
}
Run Code Online (Sandbox Code Playgroud)

incrementList() and getList()我们无法删除上面 POJO 中的这些方法,因为它在很多地方都使用了。现在,当mapstruct生成映射的实现时,我们如何才能忽略这些方法呢?

Fil*_*lip 5

您可以通过多种方式实现您想要的目标。问题仅在于getList()方法,incrementList()MapStruct 已忽略该方法。

忽略映射

如果您没有很多具有此模式的 POJO,并且使用此模式的映射器很少,您只需添加

@Mapping(target = "list", ignore = true)
Run Code Online (Sandbox Code Playgroud)

写你自己的AccessorNamingStrategy

如果您有很多 POJO 和很多映射器,那么我建议您编写自己的自定义AccessorNamingStrategy,将getList()方法标记为OTHER方法。

public class CustomAccessorNamingStrategy extends DefaultAccessorNamingStrategy {

    @Override
    public boolean isGetterMethod(ExecutableElement method) {
        if (method.getSimpleName().toString().equals("getList")) {
            return false;
        } else {
            return super.isGetterMethod(method);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)