如何将 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);
    }
  }
}