我应该在使用 lombok 时实例化一个字段吗?

Should I instantiate a field when I use lombok

我使用 lombok 省略了 java bean 的 getter 和 setter。 这是书中的一个例子 "Spring in Action 5 edition"

一个java豆:

@Data
public class Taco {

  @Size(min=1, message="You must choose at least 1 ingredient")
  private List<String> ingredients;

}

控制器:

  @PostMapping
  public String processDesign(@Valid @ModelAttribute("design") Taco design, Errors errors, Model model) {
    if (errors.hasErrors()) {
      return "design";
    }
    System.out.println(design.getIngredients());    
    return "redirect:/orders/current";
  }

渲染视图:

<form method="POST">
        <input name="ingredients" type="checkbox" value="FLTO">
        <span>Flour Tortilla</span><br>

        <input name="ingredients" type="checkbox" value="GRBF">
        <span>Ground Beef</span><br>

</form>

当我提交表单并且没有选中复选框时,验证不起作用,在控制器中,errors.hasErrors() 为 false,design.getIngredients()null

然后我更改 java bean 中的代码:

  private List<String> ingredients=new ArrayList<>();

验证有效,用户将收到消息:"You must choose at least 1 ingredient"

但我的问题是:即使我已经使用了 lombok,我是否应该实例化一个字段,尤其是对于引用字段?有没有办法使用注释来做到这一点?

您可以定义 nullary 构造函数并在其中初始化 List。 Lomboks 构造函数将被覆盖。

@Data
public class Taco {

  @Size(min=1, message="You must choose at least 1 ingredient")
  private List<String> ingredients;

  public Taco() {
     ingredients = new ArrayList<>()
  }

}