找不到用@Named#value注释的方法

lab*_*uka 15 java spring-boot mapstruct

当我尝试实现自己的映射时,我在使用 MapStruct 版本 1.4.1 时遇到问题。这是我写的代码:

package com.kucazdravlja.user.mappers;

import com.kucazdravlja.user.dto.NoticeBoardDto;
import com.kucazdravlja.user.entities.NoticeBoard;
import com.kucazdravlja.user.entities.NoticeBoardStatus;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;

import java.util.Objects;

@Mapper(uses = {BaseJournalMapper.class})
public interface NoticeBoardMapper {

    @Mapping(source = "status", target = "status", qualifiedByName = "getNoticeBoardStatusName")
    NoticeBoard dtoToEntity(NoticeBoardDto noticeBoardDto);

    @Mapping(source = "status", target = "status", qualifiedByName = "getNoticeBoardStatusDescription")
    NoticeBoardDto entityToDto(NoticeBoard noticeBoard);

    @Named("getNoticeBoardStatusDescription")
    static String getNoticeBoardStatusDescriptionConverter(NoticeBoard noticeBoard) {
        return Objects.requireNonNull(NoticeBoardStatus.findByName(noticeBoard.getStatus())).getDescription();
    }

    @Named("getNoticeBoardStatusName")
    static String getNoticeBoardStatusNameConverter(NoticeBoardDto noticeBoardDto) {
        return Objects.requireNonNull(NoticeBoardStatus.findByName(noticeBoardDto.getStatus())).name();
    }
}
Run Code Online (Sandbox Code Playgroud)

运行应用程序时它崩溃并给出错误

Error:(15, 5) java: Qualifier error. No method found annotated with @Named#value: [ getNoticeBoardStatusName ].
Run Code Online (Sandbox Code Playgroud)

不知道问题是什么,因为我有那个名称的方法。

161*_*903 17

在注释中@Mapping,您告诉 mapstruct 使用字段“status”作为映射的源。但这些方法将NoticeBoardNoticeBoardDto作为参数。您需要将参数类型更改为您的参数类型status。假设它是字符串:

@Named("getNoticeBoardStatusName")
default String getNoticeBoardStatusNameConverter(String status) {
    return Objects.requireNonNull(NoticeBoardStatus.findByName(status)).name();
}
Run Code Online (Sandbox Code Playgroud)

另外,不要在映射器中使用静态方法,default而是使用关键字。