Saltar al contenido

Asignar asignador de métodos personalizados a Mapstruct

Solución:

Como tiene varios métodos predeterminados que devuelven el mismo tipo. Debería utilizar la selección del método de asignación basada en calificadores.

Lo que esto significa es que necesitaría escribir su mapeador en el siguiente formato:

@Mapper
public interface ItemMapper {

    // Omitting other mappings for clarity
    @Mapping(source = "item", target = "locationDto", qualifiedByName = "locationDto")
    @Mapping(source = "item", target = "binType", qualifiedByName = "binType")
    @Mapping(source = "item", target = "lotSize", qualifiedByName = "lotSize")
    @Mapping(source = "item", target = "stockRails", qualifiedByName = "stockRails")
    ItemViewModel itemToDto(Item item);

    @Named("locationDto")
    default String locationToLocationDto(Item item) {
        //Omitting implementation
    }

    @Named("binType")
    default double locationToBinType(Item item) {
        //Omitting implementation
    }

    @Named("lotSize")
    default double itemToLotsize(Item item) {
        //Omitting implementation
    }

    @Named("stockRails")
    default double stockRails(Item item) {
        //Omitting implementation
    }
}

Algunas notas importantes:

  • Necesitas usar @Named del paquete MapStruct
  • En source también puede especificar el nombre del parámetro del método
  • En qualifiedByName debe especificar el valor que ha escrito en @Named

Recomiendo encarecidamente no usar expresiones para cosas tan complicadas. Es mucho más difícil corregirlo y es más difícil mantenerlo.

La forma más sencilla es utilizar la potente anotación de maptruct @AfterMapping. P.ej

@AfterMapping
public void treatAdditional(User user, @MappingTarget StudentSkillsTo studentSkillsTo) {
    System.out.println("After mapping!");
}

Mapstruct puede usar construcciones similares:

@Mapping(target = "name", expression = "java(user.getName() != null " +
        " ? user.getName() : "DefaultName")")

un expresión puede incluir cualquier construcción en java, por ejemplo

 item.getItemsOnDetailedLocations()
.iterator().next().getLocation().getLocation();

si el método es grande, entonces vale la pena llevarlo a otro servicio y llamar de esta manera

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *