【问题标题】:Using @NonNull for checking class members too也使用 @NonNull 检查班级成员
【发布时间】:2015-08-25 13:48:57
【问题描述】:

假设我有一个有 3 个成员的类:

Class A {
    private String string1; /** Cannot be null */
    private String string2; /** Cannot be null */
    private String string3; /** Can be null */
}

我有 2 个接受此类对象作为参数的方法。其中一种方法需要检查是否存在不可为空的字段,而在另一种方法中,这无关紧要:

public int func1(A object); /** Check non nullable fields */
public int func2(A object); /** No check required */

有什么干净的方法吗?使用@NonNull 注释什么的?

我尝试了各种方法,但都没有奏效。所有 NonNull 仅有助于确保 setter 不会将 null 作为参数。或者对象本身不为空。

我似乎找不到对对象进行这种递归空值检查的东西。

如果你们中的任何人能提供帮助,那就太好了。 :)

【问题讨论】:

  • 如果您确保A 是不可变的,string1string2 上的@NonNull 就足够了。
  • 这听起来像是 Spring AOP 的经典案例

标签: java spring null java-8 lombok


【解决方案1】:

Spring's中使用@Required注解

private String string1;

@Required
public void setString1(String string1) {
  this.string1= string1;
}

【讨论】:

  • 使用该方法时,每次调用该方法时都会检查所有字段是否存在?
  • 不是所有字段,只有您将添加必填注释的特定字段
  • 这需要休眠验证器,不是吗?
【解决方案2】:
class A {
    @NotNull
    private String string1; /** Cannot be null */
    @NotNull
    private String string2; /** Cannot be null */
    private String string3; /** Can be null */
}

并且在方法签名中有@Valid

public int function(@Valid A object)

【讨论】:

  • @Valid 是哪个库的一部分? Java 8 还是 Spring?似乎无法在eclipse中导入它。
  • javax.validationvalidation-api
  • 我正在使用 JDK8。找不到 javax.validation。我认为它已在此版本中删除。
  • 它不是 JDK 的一部分。它在 Hibernate Validator 或任何其他验证实现中
  • 我在 javax.validation 中使用它,但这不起作用。
【解决方案3】:

您需要一个 bean Validator,一个用于检查 bean 是否正常的类。在 Spring 中有许多实现。例如,见SmartValidatorLocalValidatorFactoryBean

@valid 注释是自动调用验证器的好方法。当您使用 Spring 时,您可以避免手动创建验证器。它仅在 Spring(或任何等效容器)调用该方法时才有效。您可能会在 BindingResult 对象中获得验证结果。例如:

@RequestMapping(value = "/MyPath", method = RequestMethod.POST)
public String postCostForm(Model model, @Valid MyForm myForm, BindingResult result){                        
        if(result.hasErrors()){             
            for(ObjectError error : result.getAllErrors()){
                  // Do something
            }                               
            return "/error";
        }else{
            return "/success";
        }
}

验证非常强大,有时也很复杂。您可以创建验证组并仅检查其中一组。您可以创建自定义约束标签,可以调用验证方法,如果验证失败,您可以自定义和国际化返回的消息。

【讨论】:

  • 我正在寻找替代方案。明确定义验证器是一种选择,但我想放弃它。
  • 好的。我改进了答案以防万一
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 2012-01-15
  • 2014-11-19
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
相关资源
最近更新 更多