没有从端点使用Spring Managed Custom Validator

时间:2018-08-21 18:57:12

标签: java hibernate validation spring-boot dependency-injection

我已经有一段时间了,但是我有一个Spring托管的自定义验证器,如下所示,其中有一些打印语句,稍后我会去做

@Component
public class BulkUpdateValidator implements ConstraintValidator<ValidBulkUpdate, BulkUpdate> {
  @Autowired
  ObjectMapper mapper;

  public BulkUpdateValidator(){
    System.out.println(this.toString());
  }

  @PostConstruct
  public void post(){
    System.out.println(mapper);
    System.out.println(this.toString());
  }

  public boolean isValid(BulkUpdate update, ConstraintValidatorContext context){
    System.out.println(this.toString());
    System.out.println(mapper);
  }
  ... other validator methods ...
}

我的控制器方法:(注意:我的控制器类在顶部带有@Validated注释)

@RequestMapping(...)
public @ResponseBody RestResponse bulkUpdate(@Valid @ValidBulkUpdate Bulkupdate bulkUpdate){
  ... stuff here ...
}

我的豆子:

public class BulkUpdate {
  @NotEmpty
  public List<String> recordIds;

  @NotEmpty
  @Valid
  public List<FieldUpdate> updates;

  .... getters and setters ....
}

这是我的问题,当我执行端点时,当我尝试使用自动装配的映射器时会收到NullPointerException。我在上面发布的打印语句的输出非常有说服力。在构造函数和@PostConstruct部分中,我都为验证器获得了相同的对象ID,并且还为映射器获得了ID。但是,一旦调用isValid,它将打印出一个不同的Object ID。我知道正在创建spring托管验证器,但未使用它。

此外,我试图从REST端点中删除@ValidBulkUpdate批注,并将其放入包装对象中,以为可能要让Spring接管@Valid,如下所示:

public @ResponseBody RestResponse bulkUpdate(@Valid BulkupdateWrapper bulkUpdate){

...这里的东西... }

然后是包装器

public class BulkUpdateWrapper {
  @ValidBulkUpdate
  private BulkUpdate update;

  .... getter and setter ....
}

这给我留下了一个甚至更奇怪的全新错误:

“ JSR-303验证的属性'update.org.hibernate.validator.internal.engine.ConstraintViolationImpl'没有相应的访问器”

我不确定该去哪里,希望有人有个主意。如何使用Spring托管的验证程序获取它,或者当我使用对象包装器时如何消除该模糊的错误;

更糟糕的是,我是否为此进行了基于MockMvc的集成测试,该测试可以完美运行,只有在部署它时才会发生。

更新

所以我保留了包装并将@Valid更改为@Validated,现在我的错误如下:“ NotReadablePropertyException:Bean属性'update.field'没有用于Spring数据绑定的相应访问器”

有趣的是,没有称为“字段”的属性

0 个答案:

没有答案