gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:43:41 39 4
gpt4 key购买 nike

我有一个下游服务,我想将其 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;
}

映射器接口(interface)

@Mapper
public interface PojoMapper {

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

这失败了,因为它无法找到 setter/getter ,因为流利地从 setter/getter 中删除了前缀,并且,我知道 mapstruct 生成映射器接口(interface)的实现并使用 bean 规范(即获取和设置前缀)

有办法解决这个问题吗?

最佳答案

如评论中所述,这可以通过编写自定义 AccessorNamingStrategy 来实现,它将方法的名称作为流畅的访问器返回。

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

除此之外还有一个公开的 PR #1373对于 MapStruct,它增加了对构建器的支持,同时它增加了对流畅的链式访问器的支持。

您的自定义策略(如 PR 中所提议的那样)可能如下所示:

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 ) );
}
}

注意:这适用于流利的 setter,您需要做一些额外的事情才能使其适用于流利的 getter。基于返回类型的 meethod.getEnclosingElement(),您需要获取属性的 Accessors 注释检查并返回方法的名称,否则您需要使用默认值。

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

关于java-8 - 来自 lombok 和 mapstruct 的@Accessors(fluent = true),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48724814/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com