来自lombok和mapstruct的@Accessors(fluent = true)

时间:2018-02-10 19:37:50

标签: java-8 lombok mapstruct

我有一个下游服务,我要将bean映射到我的bean。但是使用mapstruct似乎存在问题。

来自下游服务的Pojo(其定义我无法更改)

@ToString
@Getter
@Setter
@Accessors(fluent = true)
public class PojoA {
   private String stringA;
   private int integer;
}

我希望将其转换为PojoB

@Setter
@Getter
@ToString
public class PojoB {
    private String stringB;
    private int integer;
}

映射器接口

@Mapper
public interface PojoMapper {

    PojoMapper INSTANCE = Mappers.getMapper(PojoMapper.class);
    @Mapping(source = "stringA", target = "stringB")
    PojoB pojoAToPojoB(PojoA pojoA);
}

这失败了,因为它无法找到getters,因为它可以从getter中删除前缀,并且, 我知道mapstruct生成mapper接口的实现并使用bean规范(即get和set prefixes)

有没有办法超越它?

1 个答案:

答案 0 :(得分:4)

正如评论中所指出的那样,这可以通过编写自定义AccessorNamingStrategy来实现,该自定义public class FluentAccessorNamingStrategy extends DefaultAccessorNamingStrategy { @Override public boolean isSetterMethod(ExecutableElement method) { String methodName = method.getSimpleName().toString(); return methodName.startsWith( "set" ) && methodName.length() > 3 || isBuilderSetter( method ); } protected boolean isBuilderSetter(ExecutableElement method) { return method.getParameters().size() == 1 && !JAVA_JAVAX_PACKAGE.matcher( method.getEnclosingElement().asType().toString() ).matches() && method.getReturnType().toString().equals( method.getEnclosingElement().asType().toString() ); } @Override public String getPropertyName(ExecutableElement getterOrSetterMethod) { String methodName = getterOrSetterMethod.getSimpleName().toString(); if ( methodName.startsWith( "is" ) || methodName.startsWith( "get" ) || methodName.startsWith( "set" ) ) { return Introspector.decapitalize( methodName.substring( methodName.startsWith( "is" ) ? 2 : 3 ) ); } else if ( isBuilderSetter( getterOrSetterMethod ) ) { return methodName; } return Introspector.decapitalize( methodName.substring( methodName.startsWith( "is" ) ? 2 : 3 ) ); } } 将该方法的名称作为流畅的访问者返回。

我编写了一个自定义构建器访问器(也可以在您的情况下应用),您可以找到它here

最重要的是,MapStruct有一个开放的PR #1373,它增加了对构建器的支持,同时它增加了对流畅的链接访问器的支持。

您的自定义策略(在PR中提出)可能如下所示:

meethod.getEnclosingElement()

注意:这适用于流利的制定者,你需要做一些额外的事情才能使它适合流利的吸气者。根据返回类型的Accessors,您需要对属性进行def _mget_search(query, with_scores=False, count=False, record_term=True, **kwargs): 注释检查并返回方法的名称,否则需要使用默认值。

免责声明:我是MapStruct团队的成员之一