Mapstruct - métodos de mapeo ambiguas encontrados para propiedad de asignación

LJS:

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 ().

sjaak:

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:

  1. Usuario proporcionado método Mapping
  2. Directa (tipo fuente -target son los mismos)
  3. método de asignación (built-in)
  4. la conversión de tipos

Si todo esto falla MapStruct trata de hacer un número de 2 pasos se acerca:

  1. método de correlación - método de correlación
  2. método de correlación - conversión de tipo
  3. tipo de conversión - método de correlación

En 6. encuentra 2 métodos de clasificación ( Programa 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 Integersino unaString

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=176226&siteId=1
Recomendado
Clasificación