- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个下游服务,我想将其 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/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 5 个月前。 Improv
我正在尝试 Moose 示例: has 'options' => ( traits => ['Hash'], is => 'rw', isa
我有这个 HTML: And (Narrower search) Or (Wider search) 我收到此错误: Error: No va
使用 AngularDart Material 包。确实可以对这个错误使用一些帮助: "No value accessor for (username) or you may be missing f
考虑一个名为“rotate”的潜在实例方法,该方法通过交换 Rectangle 对象的宽度和高度值将其旋转 90 度。例如,如果矩形的尺寸为 10 x 30,则调用旋转方法会将其尺寸更改为 30 x
我正在编写一个程序,我需要为变量 accountID 创建访问器/修改器方法。这是我到目前为止所拥有的,但是当我创建访问器 public int getAccountID() 时,我无法克服这个“无法
在 section 4.3.26标准 ECMA-262 版本: Depending upon the form of the property the value may be represented
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 7 年前。 Improve
考虑这个简单的代码: class Yeah attr_reader :foo attr_reader :fool attr_reader :feel def initialize(fo
我有很多类有很多这样的属性: public AnyClass[] car { get { return this.anyClassField; }
我正在寻找 Java 中关于访问器的官方命名约定。 我已经看到,例如,JPanel 类弃用了 size() 方法,取而代之的是 getSize()。 但是在ArrayList类中,方法是size()。
我一直在争论“访问器”这个词的用法(上下文是 Java 编程)。我倾向于将访问器视为隐含的“属性访问器”——也就是说,该术语暗示它或多或少地提供对对象内部状态的直接访问。另一方坚持认为任何以任何方式触
我正在尝试编写一个 angular2 模型驱动的表单,其模型暗示了一个嵌套结构,我得到以下异常: No value accessor for 'signupInfo -> userAccount ->
我试图在 Lucee 上的组件上使用合成访问器(尽管这个问题在 ColdFusion 上似乎也一样)。 复制代码: // Person.cfc component accessors=true {
我想控制值在槽中的保存方式以及读取槽时返回的内容。这是我的类定义: (defclass object () ((name :accessor name-access :initf
我正在 eclipse、java 上制作一个基本计算器。但我对其中一种方法有疑问,因为它不接受正确的变量。 我知道问题出在 calculateDifference()和setCurrentValue(
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
好的,所以我想听听关于这个话题的意见。 我有一个哑数据对象 - CustomerOrder。 CustomerOrder 有价格和数量,但也有 TotalCash 属性(价格 * 数量)。所以我有一个
有没有办法在 C++ 中创建通用的 set/get 函数?我有一个具有大量属性但没有函数的类(好吧,我可能应该使用结构),并且真的不想为每个数据成员编写单独的 set 和 get 函数。我想到的函数类
我有一个一对多的核心数据项目。这是我的 .h: @class Categories, Tags; @interface Content : NSManagedObject @property (non
我是一名优秀的程序员,十分优秀!