He buscado durante mucho tiempo y no puedo encontrar una manera de resolver este problema. En mi aplicación de primavera tengo un BesoinPoseMapper
@FunctionalInterface @Mapper(uses = BesoinPoseTranslator.class) public interface BesoinPoseMapper { @Mappings({ @Mapping(target = "nbCapteurs", source = "valeur", qualifiedByName = {"BesoinPoseTranslator", "nbCapteurs"}), @Mapping(target = "typologie", source = "typologie", qualifiedByName = {"BesoinPoseTranslator", "typologie"}), @Mapping(target = "site", source = "site", qualifiedByName = {"BesoinPoseTranslator", "emplacement"}) }) BesoinPoseDTO entityToDTO(BesoinPoseEntity entity); }
Para asignar BesoinPoseEntity
a BesoinPoseDTO
Sin embargo, la función de mapa en BesoinPoseController
public class BesoinPoseController { @Setter @Autowired private BesoinPoseRepository besoinPoseRepo; @GetMapping() public List<BesoinPoseDTO> getBesoinsPose(@RequestParam String range, @RequestParam(required = false) String status){ return StreamSupport.stream(besoinPoseRepo.findAll().spliterator(), false) .map(BesoinPoseMapper::entityToDTO) .collect(Collectors.toList()); } }
arroja un error de compilación
.map(BesoinPoseMapper::entityToDTO); ^ required: Function<? super BesoinPoseEntity,? extends R> found: BesoinPose[...]ToDTO reason: cannot infer type-variable(s) R (argument mismatch; invalid method reference cannot find symbol symbol: method entityToDTO(BesoinPoseEntity) location: interface BesoinPoseMapper) where R,T are type-variables: R extends Object declared in method <R>map(Function<? super T,? extends R>) T extends Object declared in interface Stream
Intenté usar lambdas y cambiar los tipos de iterables a listas y matrices y volver a las secuencias, pero fue en vano, el error persiste. El compilador no puede inferir que el tipo R es BesoinPoseDTO
.
Hay alguna forma de arreglar esto ?
Gracias
Debe crear una instancia de BesoinPoseMapper
, en otras palabras, un punto de entrada a la instancia una vez que se genera la implementación de su mapeador de esta manera:
@Mapper(uses = BesoinPoseTranslator.class) public interface BesoinPoseMapper { BesoinPoseMapper INSTANCE = Mappers.getMapper(BesoinPoseMapper.class); //... }
Ahora en tu componente puedes usar:
.map(BesoinPoseMapper.INSTANCE::entityToDTO);
o :
private BesoinPoseMapper besoinPoseMapper = BesoinPoseMapper.INSTANCE; ... .map(besoinPoseMapper::entityToDTO);
O porque está usando Spring, puede usar componentModel = "spring"
:
@Mapper(uses = BesoinPoseTranslator.class, componentModel = "spring")
y luego puede inyectar su mapeador en su componente como cualquier componente de resorte, por ejemplo:
@Autowired private BesoinPoseMapper besoinPoseMapper;