当前位置: 首页 > 知识库问答 >
问题:

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

孙渝
2023-03-14
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
}

虽然我可以在createMyObject中使用@valid,但我不能在updateMyObject中使用它,因为我们的API实现要求machineName保持不变--用户可以使用完全排除machineName的JSON对象调用API,或者使用数据库中存在的相同值填充它。*

在将更新后的对象保存到数据库之前,我希望调用与使用@Valid注释将导致调用的验证器相同的验证器。我如何找到这个验证器并使用它?

共有1个答案

鄢晔
2023-03-14

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

像这样:

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

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

基本上,您从ValidationFactory获得验证器,然后像这样使用验证器:

 @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());
}
 类似资料:
  • 问题内容: 我想验证以下行为的方法如下。 在我的@Test类中,我希望做这样的事情来验证是否使用“ exception.message”和再次使用“ exception.detail”进行了调用 但是Mockito抱怨​​如下 我如何告诉Mockito检查两个值? 问题答案: 进一步的阅读使我尝试使用ArgumentCaptors和以下作品,尽管比我想要的更为冗长。

  • 我正在尝试为创建网球锦标赛的应用程序填充队列 当我单击按钮“Crear Torneo”(如图所示)时,我正在方法“crearTorneo”中创建队列。当我点击“Añadir”按钮(也可以在图像中看到)时,它会获取几个TextFields中的信息并在“llenarCola”方法中创建一个对象,返回该对象的目的是填充队列。 现在,这是我的llenarCola方法: 这是我的crearTorneo方法:

  • 问题内容: 我想使用jarsigner对jar进行签名,然后使用Java应用程序对其进行验证,该Java应用程序没有将签名的jar作为其类路径的一部分(即,仅使用jar的文件系统位置) 现在我的问题是从罐子中取出签名文件,有没有简单的方法可以做到这一点? 我玩过Inflater和Jar InputStreams并没有运气。 还是可以通过更好的方式来实现? 谢谢 问题答案: 《安全提供程序实施指南》

  • 问题内容: 有什么方法可以在应用程序上运行终端命令,然后在UI上访问数据吗?具体来说。 问题答案: 以Log Collector为例。这是相关的文件。 关键在这里:

  • 每个人 因此,我有一个SpringBoot应用程序,它带有一个控制器,该控制器有几种方法,将以下POJO作为参数: 对于其中一个控制器endpoint,我想应用额外的验证逻辑,因此在我添加了以下内容: 是我想要应用的约束注释。 我的问题是,只有在中定义的检查成功通过时,才会调用此附加约束。如果为空,约束将被忽略,客户端将收到不完整的验证结果。我错过了什么?

  • 我有一个RecyclerView,里面有这样的项目: 我使用用于侦听滑动,OnChildRaw()用于在滑动项目时绘制画布: 再刷一点: 我想在项目列表中的第一个项目上模拟(在运行时)滑动;我需要第一个项目去(或多或少)-100像素的X轴,然后回到原来的位置。如何做到这一点?