首页 > 解决方案 > 如何将 Mapstruct 与 Ad Hoc Setter 一起使用

问题描述

我正在尝试将 MapStruct 应用于 DDD。我用这样的临时设置器创建了我的实体:

@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 进行映射,但它无法正常工作,因为我的临时设置器。我该如何解决这个问题?

标签: javamappingdomain-driven-designmapstruct

解决方案


您必须实施 custom AccessorNamingStrategy13.1节详细记录了如何做到这一点。MapStruct 文档的自定义访问器命名策略

在您的情况下,它应该看起来像这样:

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

推荐阅读