【问题标题】:Mapping fields under @RequestBody@RequestBody 下的映射字段
【发布时间】:2019-07-14 19:00:37
【问题描述】:

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

正如我所理解的,下面是初始化对象的点,所以在这些点中我们应该做一些事情来初始化空列表以防空列表。

  • 控制器(当对象来自前端时)
  • 初始化(new AnyObject() 或 AnyObject.toBuilder - lombok)
  • FeginClient - API 之间的调用

是否有一些框架/注释在 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 初始化 - @Singular 注解 - 控制器/Feign 客户端 - 将此代码 sn-p 注入到 spring 过滤器 - 通过构造函数初始化 - 使用静态工厂方法,该方法将使用此代码剪切并返回“增强”实例

还有其他想法/框架吗?

【问题讨论】:

  • 完全无法理解您的疑问,您能解释一下吗?
  • 不清楚你的问题是什么。如果你想要一个默认的空列表,那么你不能只做List&lt;Record&gt; records = new ArrayList&lt;&gt;();
  • 如果我在控制器中收到这个实例,这将不起作用

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


【解决方案1】:

我建议将@Singular 注解与@Builder 一起使用。这将使用非空列表初始化集合。通过使用@Singular 注解注解其中一个参数(如果使用@Builder 对方法或构造函数进行注解)或字段(如果使用@Builder 对类进行注解),lombok 会将该构建器节点视为一个集合,并生成 2'adder ' 方法而不是 'setter' 方法。一种将单个元素添加到集合中,另一种将另一个集合的所有元素添加到集合中。不会生成仅设置集合(替换已添加的任何内容)的设置器。还会生成“清除”方法。你可以阅读我最近的文章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;
}

【讨论】:

  • 这将有助于字段初始化,当列表为 null 的有效负载从前端作为 null 传入时怎么办?
猜你喜欢
  • 2020-02-20
  • 1970-01-01
  • 2018-10-27
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
  • 2020-04-17
相关资源
最近更新 更多