我对java不太了解,但我认为它应该足以管理这个小任务。。。
我正在构建一个微服务,它通过几个rest端点提供歌曲和歌曲列表。但它不仅在被调用时返回一首歌曲,它还必须联系另一个服务并用附加信息增强歌曲对象。为此,我实现了一个dto类,并使用mapstruct来处理后面的逻辑。我在其他项目中也没有遇到任何问题。但现在我在挣扎,因为这个错误,我不知道如何解决它说:
mk.microservices.songsservice.services.songserviceimpl中构造函数的参数1需要一个类型为“mk.microservices.songsservice.web.mapper.songmapper”的bean,但找不到该bean。
行动:
考虑在您的配置中定义“mk.microservices.songsservice.web.mapper.songmapper”类型的bean。
以下是我的代码摘录:
songserviceimpl公司
import lombok.RequiredArgsConstructor;
import mk.microservices.songsservice.domain.Song;
import mk.microservices.songsservice.repositories.SongRepository;
import mk.microservices.songsservice.web.mapper.SongMapper;
import mk.microservices.songsservice.web.model.SongDto;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@RequiredArgsConstructor
@Service
public class SongServiceImpl implements SongService {
private final SongRepository songRepository;
private final SongMapper songMapper;
@Override
public SongDto getSongById(Integer id) {
return songMapper.songToSongDto(songRepository.findById(id));
}
@Override
public List<Song> getAllSongs() {
return songRepository.findAll();
}
....
}
歌曲Map器
import org.mapstruct.DecoratedWith;
import java.util.Optional;
@MapStruct
@DecoratedWith(SongMapperDecorator.class)
public interface SongMapper {
SongDto songToSongDto(Optional<Song> song);
SongDto songToSongDtoWithSongInfo(Song song);
Song songDtoToSong(SongDto songDto);
}
songmapperdecorator公司
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Optional;
public class SongMapperDecorator implements SongMapper {
private SongInfoService songInfoService;
private SongMapper mapper;
@Autowired
public void setMapper(SongMapper songMapper) { this.mapper = songMapper; }
@Override
public SongDto songToSongDto(Optional<Song> song) {
return mapper.songToSongDto(song);
}
@Override
public SongDto songToSongDtoWithSongInfo(Song song) {
SongDto songDto = mapper.songToSongDto(Optional.ofNullable(song));
SongInfo songInfo = songInfoService.getSongInfoBySongId(song.getId());
songDto.setDescription(songInfo.getDescription());
return songDto;
}
@Override
public Song songDtoToSong(SongDto songDto) {
return mapper.songDtoToSong(songDto);
}
}
也做了清理,验证和编译没有任何错误。但当我核实的时候,我发现:
[错误]无法执行goal org.apache.maven。plugins:maven-compiler-plugin:3.8.0:在project songs服务上编译(默认编译):解析annotationprocessorpath依赖项失败:缺少:[error]
3条答案
按热度按时间bq9c1y661#
-[error]1)org。mapstruct:mapstruct-processor:jar:1.4.2
我的pom看起来像这样:
mapstruct的依赖关系:
以及支持mapstruct和lombok协同工作的插件:
如果有人能帮我解决这个问题,我会很高兴的。已经在google上搜索了很多,但还没有找到任何有用的东西。
br,麦克风
wecizke32#
从错误中可以清楚地看到,songserviceimpl需要一个bean songmapper,但是mapstruct在默认情况下不生成springbean。i、 e它不会在生成的类中添加@component注解,因此我们需要显式地提到生成一个可用于创建springbean的类。
所以
@MapStruct
使用@Mapper(componentModel = "spring")
在mapper界面中。laximzn53#
最终解决了这个问题,将pom中的mapstruct版本改为1.4.2.final(而不是1.4.2)。现在它工作了。。。
从mapstruct文档中得到提示。。。