@RequestBody下的映射字段

时间:2019-02-21 00:23:31

标签: spring spring-boot spring-mvc spring-data-jpa lombok

我想为“列表”类型的字段添加空值

由于我在下面强调的是初始化对象的点,因此在这些情况下,我们应该做一些事情来初始化空列表(如果为null)。

  • 控制器(当对象从前端来时)
  • 初始化(新的AnyObject()或AnyObject.toBuilder-lombok)
  • FeginClient-Apis之间的呼叫

是否有一些框架/注释,如果为null,将设置空列表?

下面是我目前所做的

public class TestMapin {
    public static void main(String[] args) throws IllegalAccessException {
        Test test = new Test();

        notNull(test);

        System.out.println(test);
    }

    public static void notNull(Object test) throws IllegalAccessException {
        for (Field field : test.getClass().getDeclaredFields()) {

            boolean access = field.canAccess(test);
            field.setAccessible(true);

            if (field.get(test) == null) {
                if (field.getType().isAssignableFrom(List.class)) {
                    field.set(test, Collections.emptyList());
                } else if (field.getType().isAssignableFrom(Map.class)) {
                    field.set(test, Collections.emptyMap());
                }
            } else if (field.getType().getPackageName().contains("org.owozniak.selfestem")) {
                notNull(field);
            }

            field.setAccessible(access);
        }
    }
}

@Setter
@ToString
class Test {
    private ArrayList<String> stringList;
    private Box box = Box.builder().build();
    private Magazine magazine;
}

所以,我需要使用 -通过toBuilder初始化-@单注 -控制器/伪装客户-将此代码段注入到弹簧过滤器中 -通过构造函数进行初始化-使用静态工厂方法,该方法将使用此代码片段并返回“增强”实例

还有其他想法/框架吗?

1 个答案:

答案 0 :(得分:0)

我建议将@Singular注释与@Builder一起使用。这将使用非空列表初始化集合。通过使用@Singular注释对参数之一(如果使用@Builder注释方法或构造函数)或字段(如果使用@Builder注释类),lombok将把该生成器节点视为一个集合,并生成2'adder方法而不是“设置”方法。一个将单个元素添加到集合中,另一个将另一个集合的所有元素添加到集合中。将不会生成仅设置集合(替换已添加的任何内容)的设置器。还会生成“清除”方法。您可以阅读我最近的文章https://technicalsand.com/using-lombok-advanced-features/

的完整详细信息
import lombok.Builder;
import lombok.Singular;
import java.util.Set;
@Builder
public class BuilderExample {
    @Builder.Default private long created = System.currentTimeMillis();
    private String name;
    private int age;
    @Singular 
    private Set<String> occupations;
}