Mah*_*108 1 spring lombok spring-boot mapstruct
我对Java了解不多,但我认为它应该足以管理这个小任务......
我正在构建一个微服务,它通过多个休息端点提供歌曲和歌曲列表。但它不仅仅在调用时返回歌曲,它还必须联系另一个服务并使用附加信息增强歌曲对象。为此,我实现了一个 Dto-Class,并使用 mapstruct 来处理后面的逻辑。我在其他项目中也这样做过,没有任何问题。但现在我很挣扎,因为这个错误,我不知道如何解决 - 它说:
mk.microservices.songsservice.services.SongServiceImpl 中的构造函数的参数 1 需要类型为“mk.microservices.songsservice.web.mapper.SongMapper”的 bean,但无法找到。
行动:
考虑在配置中定义“mk.microservices.songsservice.web.mapper.SongMapper”类型的 bean。
以下是我的代码的摘录:
歌曲服务实现
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();
}
....
}
Run Code Online (Sandbox Code Playgroud)
歌曲映射器
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);
}
Run Code Online (Sandbox Code Playgroud)
SongMapper装饰器
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);
}
}
Run Code Online (Sandbox Code Playgroud)
还进行了清理、验证和编译,没有任何错误。但当我进行验证时,我得到了这个:
[错误] 无法在项目歌曲服务上执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile):注释ProcessorPath 依赖项的解析失败:缺少:[错误] -- -------- [错误] 1) org.mapstruct:mapstruct-processor:jar:1.4.2
我的 POM 看起来像这样:
mapstruct 的依赖关系:
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
以及用于启用 mapstruct 和 lombok 协同工作的插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<compilerArg>
-Amapstruct.defaultComponentModel=spring
</compilerArg>
</compilerArgs>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
如果有人能帮助我解决这个问题,我会非常高兴。已经用谷歌搜索了很多,但还没有找到任何有用的东西。
兄弟,麦克风
小智 8
从错误中可以清楚地看出,SongServiceImpl 需要一个 bean SongMapper,但 Mapstruct 默认情况下不会生成 spring bean。也就是说,它不会在生成的类中添加@Component注解,因此我们需要明确提及生成一个可用于创建spring bean的类。
所以而不是在映射器接口中@MapStruct使用。@Mapper(componentModel = "spring")
| 归档时间: |
|
| 查看次数: |
5204 次 |
| 最近记录: |