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)