Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以编程方式调用在Spring中带有@Valid参数的@RequestMethod方法上运行的同一个验证器?_Java_Spring_Hibernate Validator_Spring Validator - Fatal编程技术网

Java 如何以编程方式调用在Spring中带有@Valid参数的@RequestMethod方法上运行的同一个验证器?

Java 如何以编程方式调用在Spring中带有@Valid参数的@RequestMethod方法上运行的同一个验证器?,java,spring,hibernate-validator,spring-validator,Java,Spring,Hibernate Validator,Spring Validator,我有一个类,在某些字段上带有hibernate的验证注释(例如@NotNull和@Size(min=4,max=50),等等) 我还有一个充当JSON API的自定义控制器,还有一个JSON反序列化器,在调用API方法时创建MyClass对象。在我的自定义控制器中,我有一个方法来创建该类型的新对象: @RequestMapping(method = RequestMethod.POST) public long createMyObject(@RequestBody @Valid MyClass

我有一个类,在某些字段上带有hibernate的验证注释(例如
@NotNull
@Size(min=4,max=50)
,等等)

我还有一个充当JSON API的自定义控制器,还有一个JSON反序列化器,在调用API方法时创建MyClass对象。在我的自定义控制器中,我有一个方法来创建该类型的新对象:

@RequestMapping(method = RequestMethod.POST)
public long createMyObject(@RequestBody @Valid MyClass newObj) {
    // Create the object in the database
    return newObj.getId();
}
以及另一种更新现有对象的方法

@RequestMapping(method = RequestMethod.PUT)
public void updateMyObject(@RequestBody MyClass updatedObj) {
    MyClass existingObj = // Get existing obj from DB by updatedObj.getId();

    // Do some secondary validation, such as making sure that a specific
    // field remains unchanged compared to the existing instance
    if (existingObj.getMachineName() != null && 
            !existingObj.getMachineName().equals(updatedObj.getMachineName())) {
        throw new CannotChangeMachineNameException();
    }
    else {
        updatedObj.setMachineName(existingObj.getMachineName());
    }

    // [HERE IS WHERE I WANT THE MAGIC TO HAPPEN]

    // Save updatedObj to the database
}
虽然我可以在
createMyObject
中使用
@Valid
,但我不能在
updateMyObject
中使用它,因为我们的API实现要求machineName保持不变-用户可以使用JSON对象调用API,该对象要么完全排除machineName,要么使用数据库中存在的相同值填充它*


在将更新的对象保存到数据库之前,我想调用@Valid注释将导致调用的同一个验证器。如何找到并使用此验证器?

没有任何说明您只需要在控制器方法中使用@Valid。为什么不让一个验证方法接受您注释为@Valid的参数,然后返回相同的参数呢

像这样:

public Book validateBook(@Valid Book book) {
   return book;
}
另一种方法是使用Hibernate的验证包

基本上,您可以从
验证工厂
获得
验证程序
,然后像这样使用验证程序:

 @Test
    public void manufacturerIsNull() {
        Car car = new Car(null, "DD-AB-123", 4);

        Set<ConstraintViolation<Car>> constraintViolations =
            validator.validate(car);

        assertEquals(1, constraintViolations.size());
        assertEquals("may not be null", constraintViolations.iterator().next().getMessage());
}
@测试
public void manufacturerIsNull(){
轿厢=新车(空,“DD-AB-123”,4);
设置约束条件=
验证器。验证(car);
assertEquals(1,constraintViolations.size());
assertEquals(“可能不为null”,constraintViolations.iterator().next().getMessage());
}

我认为您可以使用验证组。将
machineName
上的
@NotNull
以外的所有验证(或比较新旧名称的自定义验证程序)都置于默认组中,并将其余验证程序置于
更新
组中。在
updateMyObject
方法中使用这两个组。看,谢谢!这让我非常接近答案-第一个方法不起作用,我做了与第二个方法类似的事情:Set errors=Validation.buildDefaultValidatorFactory().getValidator().validate(updateObj);//我从您指向的文档中了解到这一点validateBook方法是否会引发任何异常?如果验证失败怎么办?第一种方法不会启动任何验证。还是我遗漏了什么?@Happy很可能是从同一个类调用了该方法,这样验证方法就不会被代理
 @Test
    public void manufacturerIsNull() {
        Car car = new Car(null, "DD-AB-123", 4);

        Set<ConstraintViolation<Car>> constraintViolations =
            validator.validate(car);

        assertEquals(1, constraintViolations.size());
        assertEquals("may not be null", constraintViolations.iterator().next().getMessage());
}