如何将 Mapstruct 与 Ad Hoc Setters 一起使用
How to use Mapstruct with Ad Hoc Setters
我正在尝试将 MapStruct 应用于 DDD。我用这样的临时 setter 创建了我的实体:
@AllArgsContructor
@NoArgsConstructor //necessary to MapStruct
@Getter
class Employee {
private String id;
private String name;
public void updateName(String newName) {
this.name = newName;
}
}
我有一个 EmployeeDto
可以将数据发送到前端 API:
@Getter
@AlArgsConstructor
@NoArgsConstructor //necessary to MapStruct
class EmployeeDto {
private String name;
private String id;
}
所以,我正在尝试使用 MapStruct 进行映射,但它不起作用,因为我的临时 setter。我该如何解决这个问题?
您必须实施自定义 AccessorNamingStrategy
。 MapStruct 文档的 13.1. Custom Accessor Naming Strategy 部分详细记录了如何执行此操作的方法。
在您的情况下,它应该看起来像这样:
public class CustomAccessorNamingStrategy extends DefaultAccessorNamingStrategy {
@Override
public boolean isSetterMethod(ExecutableElement method) {
String methodName = method.getSimpleName().toString();
return methodName.startsWith("update") && methodName.length() > 6;
}
@Override
public String getPropertyName(ExecutableElement getterOrSetterMethod) {
if (isSetterMethod(getterOrSetterMethod)) {
String methodName = getterOrSetterMethod.getSimpleName().toString();
return IntrospectorUtils.decapitalize(methodName.substring(6));
} else {
return super.getPropertyName(getterOrSetterMethod);
}
}
}
我正在尝试将 MapStruct 应用于 DDD。我用这样的临时 setter 创建了我的实体:
@AllArgsContructor
@NoArgsConstructor //necessary to MapStruct
@Getter
class Employee {
private String id;
private String name;
public void updateName(String newName) {
this.name = newName;
}
}
我有一个 EmployeeDto
可以将数据发送到前端 API:
@Getter
@AlArgsConstructor
@NoArgsConstructor //necessary to MapStruct
class EmployeeDto {
private String name;
private String id;
}
所以,我正在尝试使用 MapStruct 进行映射,但它不起作用,因为我的临时 setter。我该如何解决这个问题?
您必须实施自定义 AccessorNamingStrategy
。 MapStruct 文档的 13.1. Custom Accessor Naming Strategy 部分详细记录了如何执行此操作的方法。
在您的情况下,它应该看起来像这样:
public class CustomAccessorNamingStrategy extends DefaultAccessorNamingStrategy {
@Override
public boolean isSetterMethod(ExecutableElement method) {
String methodName = method.getSimpleName().toString();
return methodName.startsWith("update") && methodName.length() > 6;
}
@Override
public String getPropertyName(ExecutableElement getterOrSetterMethod) {
if (isSetterMethod(getterOrSetterMethod)) {
String methodName = getterOrSetterMethod.getSimpleName().toString();
return IntrospectorUtils.decapitalize(methodName.substring(6));
} else {
return super.getPropertyName(getterOrSetterMethod);
}
}
}