未找到在上 class 上用 @Named#value 注释的方法
No method found annotated with @Named#value on upper class
我正在使用具有以下依赖性的 mapstruct:
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.0.Final</version>
<scope>provided</scope>
</dependency>
然后我有一个包含基本 @Named
方法的接口:
public interface CommonConverter {
@Named("formatDateString")
default String formatDateString(Date date){
if(date == null){
return null;
}
return DateUtils.formatDateString(date);
}
@Named("formatStringDate")
default Date formatStringDate(String dateStr){
if(StringUtils.isEmpty(dateStr)){
return null;
}
return DateUtils.formatStringDate(dateStr);
}
@Named("convertTimestampToString")
default String convertTimestampToString(Long date) {
if (date == null || date.equals(0L)){
return StringUtils.EMPTY;
}
return DateUtils.convertTimeToDateStr(date, 0);
}
}
现在我有另一个扩展 CommonConverter
的 mapstruct 转换器
@Mapper(componentModel = "spring")
public interface EmployeeEventConverter extends CommonConverter{
@Mappings({
@Mapping(source = "claimDate", target = "claimDate", qualifiedByName = "formatDateString"),
@Mapping(source = "eventStartDate", target = "eventStartDate", qualifiedByName = "formatDateString"),
//@Mapping(source = "target", target = "targetAsString", qualifiedByName = "formatTargetString"),
@Mapping(source = "target", target = "targets", qualifiedByName = "convertTarget")
})
EmployeeEventClaimDTO toClaimDTO(EmployeeEventClaimDO entity);
List<EmployeeEventClaimDTO> toClaimDTOs(List<EmployeeEventClaimDO> entities);
}
这个 class 工作正常,直到我升级到 1.4.1.Final
,我在编译项目时遇到了这个异常:
Qualifier error. No method found annotated with @Named#value: [ formatDateString ].
为了克服这个问题,我需要将所有 @Named
复制到 class EmployeeEventConverter
(以及许多其他类似的 classes),这会增加 LOC 和重复代码。
任何人都知道为什么会发生以及如何解决它?
谢谢
替代扩展
您可以尝试 Mapper
注释的 uses
属性 而不是 extends
。
@Mapper(componentModel = "spring", uses = CommonConverter.class )
public interface EmployeeEventConverter
报告 MapStruct 问题
然而,这确实感觉像是 Mapstruct 的问题。
能不能看看用1.4.2.Final
版本和1.5.0.RC1
版本是不是也有这个问题?如果是这样,请在 https://github.com/mapstruct/mapstruct/issues.
创建一个问题
我正在使用具有以下依赖性的 mapstruct:
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.0.Final</version>
<scope>provided</scope>
</dependency>
然后我有一个包含基本 @Named
方法的接口:
public interface CommonConverter {
@Named("formatDateString")
default String formatDateString(Date date){
if(date == null){
return null;
}
return DateUtils.formatDateString(date);
}
@Named("formatStringDate")
default Date formatStringDate(String dateStr){
if(StringUtils.isEmpty(dateStr)){
return null;
}
return DateUtils.formatStringDate(dateStr);
}
@Named("convertTimestampToString")
default String convertTimestampToString(Long date) {
if (date == null || date.equals(0L)){
return StringUtils.EMPTY;
}
return DateUtils.convertTimeToDateStr(date, 0);
}
}
现在我有另一个扩展 CommonConverter
@Mapper(componentModel = "spring")
public interface EmployeeEventConverter extends CommonConverter{
@Mappings({
@Mapping(source = "claimDate", target = "claimDate", qualifiedByName = "formatDateString"),
@Mapping(source = "eventStartDate", target = "eventStartDate", qualifiedByName = "formatDateString"),
//@Mapping(source = "target", target = "targetAsString", qualifiedByName = "formatTargetString"),
@Mapping(source = "target", target = "targets", qualifiedByName = "convertTarget")
})
EmployeeEventClaimDTO toClaimDTO(EmployeeEventClaimDO entity);
List<EmployeeEventClaimDTO> toClaimDTOs(List<EmployeeEventClaimDO> entities);
}
这个 class 工作正常,直到我升级到 1.4.1.Final
,我在编译项目时遇到了这个异常:
Qualifier error. No method found annotated with @Named#value: [ formatDateString ].
为了克服这个问题,我需要将所有 @Named
复制到 class EmployeeEventConverter
(以及许多其他类似的 classes),这会增加 LOC 和重复代码。
任何人都知道为什么会发生以及如何解决它?
谢谢
替代扩展
您可以尝试 Mapper
注释的 uses
属性 而不是 extends
。
@Mapper(componentModel = "spring", uses = CommonConverter.class )
public interface EmployeeEventConverter
报告 MapStruct 问题
然而,这确实感觉像是 Mapstruct 的问题。
能不能看看用1.4.2.Final
版本和1.5.0.RC1
版本是不是也有这个问题?如果是这样,请在 https://github.com/mapstruct/mapstruct/issues.