Не найден метод с аннотацией @Named#value

#java #spring-boot #mapstruct

#java #весенняя загрузка #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();
    }
}
 

При запуске приложения оно выходит из строя и выдает ошибку

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

Не уверен, в чем проблема, потому что у меня есть этот метод с таким именем.

Ответ №1:

В своей @Mapping аннотации вы указываете mapstruct использовать поле «статус» в качестве источника для сопоставления. Но методы принимают NoticeBoard и NoticeBoardDto в качестве параметров. Вам нужно изменить тип параметра на любой ваш status . Предполагая, что это строка:

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

Кроме того, не используйте статические методы в картографах, default вместо этого используйте ключевое слово.