0
votes

MapStruit: Exclure la propriété basée sur la valeur (booléenne)

Je suis conscient que Mapstructeur peut ignorer les propriétés malappées et les propriétés cible spécifiques, mais est-il possible d'exlcucer une propriété basée sur sa valeur réelle?

J'ai des champs booléens que je voudrais exclure que si elles sont fausses . P>

Merci d'avance! p>

Exemple: P>

Entité: P>

@Mapper(componentModel = "spring")
public interface VehicleMapper {

// Entity to DTO:
VehicleDTO toVehicleDTO(Vehicle vehicle);
List<VehicleDTO> toVehicleDTOs(List<Vehicle> vehicles);

// DTO to Entity:
Vehicle toVehicle(VehicleDTO vehicleDTO);
}


2 commentaires

S'il vous plaît partager le code


J'ai ajouté un exemple


3 Réponses :


0
votes

Vous pouvez utiliser Jackson pour ignorer les champs NULLL.

public static String[] gePropertyNames(Object source) {
    final BeanWrapper wrappedSource = new BeanWrapperImpl(source);
    return Stream.of(wrappedSource.getPropertyDescriptors())
            .map(FeatureDescriptor::getName)
            .filter(propertyName -> {
                    if(wrappedSource.getPropertyValue(propertyName) != null && wrappedSource.getPropertyValue(propertyName) instanceof Boolean){
                        Boolean value = (Boolean) wrappedSource.getPropertyValue(propertyName);
                        if(value){
                            return false;
                        }else{
                            return true;
                        }
                    }else{
                        return false;
                    }
            }).toArray(String[]::new);
}

// then use Spring BeanUtils to copy and ignore properties using our function
public static void myCopyProperties(Object src, Object target) {
    BeanUtils.copyProperties(src, target, gePropertyNames(src));
}


0 commentaires

0
votes

Je ne suis pas sûr s'il y a un moyen propre à faire dans le méccuteur. Une façon est d'utiliser des expressions dans le métrage. Je suppose que le code ci-dessous peut aider.

@Mapper(componentModel = "spring")
public interface VehicleMapper {

@Mapping(target = "hasWheels", expression = "java((hasWheels)?hasWheels:false)")
Vehicle toVehicle(VehicleDTO vehicleDTO);
}


0 commentaires

0
votes

Mapstructeur a le concept de Vérification de la présence de la source . Par défaut (lorsqu'une conversion implicite se produit), il vérifie si la valeur source est null code> avant de l'attribuer à la cible. Il y a aussi une façon de Vérification de la propriété source pour null code> argument en utilisant l'option nullvaluecheckstrategy = nullvaluecheckstrategy.always code>, qui comprendra toujours un null code> chèque lorsque la source est non primitive. , à moins qu'un vérificateur de présence source soit défini sur le haricot source.

avoir dit tout cela. Étant donné que dans votre cas, les propriétés de la source sont primitives booléennes, vous pouvez y parvenir en ajoutant une vérification de présence pour ces champs. Éliminant ainsi le besoin d'une expression. P>

E.g. Pour la DTO P>

@Getter @Setter
public class VehicleDTO {

    private String name;
    private boolean hasWheels;
    private boolean hasWings;
    private boolean hasBrakes;

    public boolean hasHasWheels() {
        return hasWheels;
    }
}


0 commentaires