Estoy usando mapstruct al mapa de uno a otro DTO. Tengo varios métodos por defecto, pero 2 de ellos con un valor de retorno de la cadena y que utiliza la misma clase que el parámetro de entrada me da "métodos de mapeo ambiguos utilizando Java Mapstruct" error. Estoy añadiendo las partes pertinentes del Código de Seguridad:
@Mappings({
@Mapping(source = "programInstance", target = "title", qualifiedByName = "title"),
@Mapping(source = "programInstance", target = "seriesName", qualifiedByName = "seriesName"),
@Mapping(source = "programInstance", target = "season", qualifiedByName = "season"),
@Mapping(source = "programInstance", target = "epNumber", qualifiedByName = "epNumber"),
})
DTO1 mapDTOs (DTO2 dto2);
@Named("title")
default String mapTitle(Program programInstance) {
Optional<String> title = Utils.getObject(() -> programInstance.getTitle().getDescriptions().get(0).getValue());
if (title.isPresent())
return title.get();
return null;
}
@Named("seriesName")
default String mapSeriesName(Program programInstance) {
Optional<String> seriesName = Utils.getObject(() -> programInstance.get(0).getProgram().getTitle().getDescriptions().get(0).getValue());
if (seriesName.isPresent())
return seriesName.get();
return null;
}
@Named("season")
default Integer mapSeasonNumber(Program programInstance) {
Optional<Integer> season = Utils.getObject(() -> programInstance.get(0).getSeasonOf().get(0).getOrderNo());
if (season.isPresent())
return season.get();
return null;
}
@Named("epNumber")
default Integer mapEpNumber(Program programInstance) {
Optional<Integer> epNumber = Utils.getObject(() -> programInstance.getEpOf().get(0).getOrderNo());
if (epNumber.isPresent())
return epNumber.get();
return null;
}
El error es
métodos de mapeo ambiguas encontrados para propiedad de asignación "Programa programInstance" a java.lang.String: java.lang.String mapTitle (), java.lang.String mapSeriesName ().
Hemos comprobado su ejemplo .. El problema es que los campos que intenta objetivo son de tipo String.
Entonces:
public class IvpVodOfferStatusDTO {
private String seasonNumber;
private String episodeNumber;
}
MapStruct intenta hacer coincidir esto con la firma que proporciona:
@Named("season")
default Integer mapSeasonNumber(Program programInstance) {
Optional<Integer> season = Utils.getObject(() -> programInstance.get(0).getSeasonOf().get(0).getOrderNo());
if (season.isPresent())
return season.get();
return null;
}
@Named("epNumber")
default Integer mapEpNumber(Program programInstance) {
Optional<Integer> epNumber = Utils.getObject(() -> programInstance.getEpOf().get(0).getOrderNo());
if (epNumber.isPresent())
return epNumber.get();
return null;
}
MapStruct tiene un orden predefinido de intentos:
- Usuario proporcionado método Mapping
- Directa (tipo fuente -target son los mismos)
- método de asignación (built-in)
- la conversión de tipos
Si todo esto falla MapStruct trata de hacer un número de 2 pasos se acerca:
- método de correlación - método de correlación
- método de correlación - conversión de tipo
- tipo de conversión - método de correlación
En 6. encuentra 2 métodos de clasificación ( Program
a String
). Es probablemente un error en MapStruct que selecciona métodos que no reúnan los requisitos (necesidad de comprobar si esto es intencional) por el @Named
. De lo contrario, voy a escribir un problema.
La solución más fácil es: adaptarse al objetivo:
public class IvpVodOfferStatusDTO {
private Integer seasonNumber;
private Integer episodeNumber;
}
Lo que es probablemente lo que se propone (supongo) .. De lo contrario podría cambiar la firma no devolver un Integer
sino unaString