繁体   English   中英

如何以编程方式在Spring中使用@Valid参数调用在@RequestMethod方法上运行的相同验证器?

[英]How can I programmatically call the same validator that runs on a @RequestMethod method with a @Valid parameter in Spring?

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

public class MyClass {

    Long id;

    @NotEmpty
    @Size(min = 4, max = 50)
    String machineName;

    @NotEmpty
    @Size(min = 4, max = 50)
    String humanName;

    // Getters, setters, etc…
}

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

@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
}

虽然我可以用@ValidcreateMyObject ,我不能用它updateMyObject因为我们的API实现需要计算机名保持不变-用户可以调用一个JSON对象的API,要么排除完全计算机名或存在于相同的值来填充它数据库。*

在将更新的对象保存到数据库之前,我想调用具有@Valid注释的相同验证器来调用它。 我怎样才能找到这个验证器并使用它?

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

像这样:

public Book validateBook(@Valid Book book) {
   return book;
}

看起来另一种方法是使用Hibernate的验证包。 这是它的文档

基本上,您从ValidationFactory获得Validator ,然后使用如下验证器:

 @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());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM