es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Establecer Estrategia de Valor Predeterminado con Múltiples Objetos Fuente en MapStruct.

Quiero generar comprobaciones de nulos en propiedades mapeadas de mis objetos fuente y establecer un valor predeterminado si la propiedad fuente es nula.

He intentado usar NullValuePropertyMappingStrategy.SET_TO_DEFAULT en @Mapper y en @Mapping targets, pero el código generado no incluía los setters predeterminados.

Básicamente, lo que estoy tratando de lograr es:

@Mapper (componentModel = “spring”)
public interface OperationDataMapper {
OperationDTO from (Object 1 o1, Object2 o2);
}

Para que mi código generado sea:

@Component
public class OperationDataMapperImpl implements OperationDataMapper {

@Override
public OperationDTO from (Object 1 o1, Object2 o2) {
    if (o1 == null && o2 == null) {
        return null;
    }

    OperationDTO operationDTO = new OperationDTO();

    if (o1 != null) {
        if (o1.getProp1 ()! = null) {
            operationDTO.setProp1 (o1.getProp1 ())
        } else {
            operationDTO.setProp1 ("") // si la propiedad es una cadena, por ejemplo
        }
        .
        .
    }

    if (o2! = Null) {
        if (o2.getProp2 ()! = null) {
            operationDTO.setProp2 (o2.getProp2 ())
        } else {
            operationDTO.setProp2 ("") // si la propiedad es una cadena, por ejemplo
        }
        .
        .
    }

    devuelve operationDTO;
}

}

No escribí mi ejemplo con la estrategia de valor predeterminado como la documentación señala porque no funcionó en mis intentos de asignar las propiedades anidadas con valores nulos. Lo interesante es que NullValueCheckStrategy funciona sin problemas, pero NullValuePropertyMappingStrategy no funciona.

También he intentado establecerlos usando un @BeanMapping sin éxito.

¡Si alguien pudiera apuntarme en la dirección correcta, lo apreciaría!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que ya has intentado establecer la estrategia NullValuePropertyMappingStrategy.SET_TO_DEFAULT en tu anotación @Mapper y objetivos @Mapping, pero el código generado no incluyó los setters por defecto. ¿Has intentado usar un método @BeforeMapping para establecer manualmente los valores por defecto de las propiedades?

    Aquí hay un ejemplo de cómo podrías usar un método @BeforeMapping para lograr lo que deseas:

    @Mapper(componentModel = "spring")
    public interface OperationDataMapper {
    
        @BeforeMapping
        default void setDefaults(Operation1 operation1, Operation2 operation2, @MappingTarget OperationDTO operationDTO) {
            if (operation1 == null && operation2 == null) {
                operationDTO = null;
                return;
            }
    
            if (operation1 != null) {
                if(operation1.getProp1() != null) {
                    operationDTO.setProp1(operation1.getProp1());
                } else {
                    operationDTO.setProp1("");
                }
                // establecer otras propiedades
            }
    
            if (operation2 != null) {
                if(operation2.getProp2() != null) {
                    operationDTO.setProp2(operation2.getProp2());
                } else {
                    operationDTO.setProp2("");
                }
                // establecer otras propiedades
            }
        }
    
        OperationDTO from(Operation1 operation1, Operation2 operation2);
    }
    

    En este ejemplo, estamos usando el método @BeforeMapping para establecer manualmente los valores por defecto de las propiedades. Estamos comprobando si tanto operation1 como operation2 son nulos, y si lo son, devolvemos un OperationDTO nulo. De lo contrario, estamos estableciendo manualmente las propiedades en función de sus valores, y estableciendo valores por defecto si son nulos.

    ¡Espero que esto te ayude! Avísame si tienes alguna pregunta adicional.

Comments are closed.