我已经有一段时间了,但是我有一个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数据绑定的相应访问器”
有趣的是,没有称为“字段”的属性