当前位置: 首页 > 知识库问答 >
问题:

MapStruct:基于(布尔)值排除属性

南门欣怡
2023-03-14

我知道MapStruct可以忽略未映射的属性和特定的目标属性,但是否可以根据属性的实际值来删除属性?

我有布尔字段,只有当它们为false时,我才想排除它们。

提前感谢!

示例:

实体:

@Entity
@Table(name = "vehicle")
@Getter @Setter
public class Vehicle {
   @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
   private int id;
   private String name;
   private boolean hasWheels;
   private boolean hasWings;
   private boolean hasBrakes;
}

DTO:

@Getter @Setter
public class VehicleDTO {

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

MapStruct映射器:

@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);
}

我只想在布尔变量的值为“false”时完全排除它们。

共有3个答案

辛龙野
2023-03-14

可以使用Jackson忽略空字段。

@JsonInclude(JsonInclude.Include.NON_NULL)
public class VehicleDTO

在下面的方法中,如果值为false,不要只将DTO中的布尔字段设置为。

//实体到DTO:

车辆DTO对车辆DTO(车辆车辆);

您还可以使用Spring BeanUtils来复制和覆盖CopProperties方法。

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));
}
王锐
2023-03-14

我不确定在MapStruct中是否有一种干净的方法。一种方法是在mapstruct中使用表达式。我想下面的代码可能会有所帮助。

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

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

但是,您使用了具有“false”默认值的原始类型布尔变量,尽管您设置或忽略了它。

万俟鸿波
2023-03-14

MapSTRt具有Source存在检查的概念。默认情况下(当发生隐式转换时),它会在将源值分配给目标之前检查源值是否为null。还有一种通过使用选项nullValueCheckStrategy=NullValueCheckStrategy来检查null参数的源属性的方法。ALWAYS,当source是非基元时,它将始终包含null检查,除非在源bean上定义了源存在检查器。

说了这么多。因为在您的示例中,源属性是基本布尔属性,所以可以通过为这些字段添加状态检查来实现这一点。这样就不需要表达式了。

e、 g.对于DTO

@Getter @Setter
public class VehicleDTO {

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

    public boolean hasHasWheels() {
        return hasWheels;
    }
}

有了这个,实现将首先检查DTO是否有hasWheels,然后才将其设置为目标。

 类似资料:
  • 问题内容: 我正在寻找一种基于布尔值对Swift数组进行排序的方法。 我已经使用强制转换为NSArray来工作了: 但是我在寻找Swift变体,有什么想法吗? 更新 感谢Arkku,我设法使用以下代码修复了此问题: 问题答案: 斯威夫特的阵列可以在适当的位置进行排序或用新的阵列。这两个函数的单个参数都是一个闭合,该闭合带有两个元素,如果第一个元素在第二个元素之前被排序,则返回。使用闭包的参数的最短

  • 我有一个布尔值,我需要设置一个基于这个布尔值的条件。我试图得到这个布尔值,然后用它在我的FutureBuilder,但我总是得到空,即使我可以看到值是在火还原。请帮助。 小装置

  • 问题内容: 我有一个表单,用于答复仅在为true 时才想显示的消息,每次单击答复按钮时,我都希望切换是否显示该表单。我怎样才能做到这一点? 问题答案: 您只需要在ng-click事件上切换“ isReplyFormOpen”的值

  • 我得到“删除字面上的”假“布尔值”以下语句错误,但我不确定是否有可能删除假。有什么想法吗?

  • 到目前为止我们看到的类型都能表示很大范围的数据,整数多的是,而浮点数更多。相对而言,字符集的规模小的多。C++中还有一个类型表示的范围更小,即布尔类型,它只能表示true和false两个值。 虽然没提到过该类型,但我们前面几章中实际已经使用过布尔值了。if语句和while语句中的条件就是布尔表达式。比较操作符的结果也是布尔值。例如: if (x == 5) { // 进行某些处理 } ==操

  • 原文: http://exploringjs.com/impatient-js/ch_booleans.html 基本类型 _ 布尔 _ 包含两个值 - false和true: > typeof false 'boolean' > typeof true 'boolean' 14.1。转换为布尔值 这三种方法可以将任意值x转换为布尔值。 Boolean(x) 最具描述性;推荐的。 x ?