我有一个下游服务,我要将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)
有没有办法超越它?
答案 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团队的成员之一