如何验证Spring中的请求参数?

How to validate request parameters in Spring?

这是我的开始代码:

PersonController.java

@RequestMapping(value = "/person", method = RequestMethod.POST)
    public ResponseEntity<?> addPerson(@Valid Person p, HttpServletResponse response) {
        ...
    }

Person.java

public class Person {    

    @NotNull
    String name;    

    @NotNull
    int age;    

    String gender;
}

要求是:当向/person发出POST请求时,如果用户没有为请求正文中的字符串 Name。注解 @NotNull 不会这样做。

我可以在 Person.java 中使用另一个注释来实现这一点吗?如果没有,我是否可以在 addPerson 方法中进行一些验证,以确保在其中一个必需参数不存在时抛出异常?

首先,您需要封装域中的字段-类。 spring 容器将使用这些 getter 和 setter 来操作对象。

然后,您可以添加constraints to these getters and setters (Bean Validation)。如果您正确添加了它们,Spring 将在使用 @Valid 注释(您所做的)时捕获错误。这些错误将被添加到 BindingResult 中,并且可以通过使用 Spring 表单标签显示在 jsp 中。

<form:errors path="field_that_was_manipulated_incorrectly" />

实际上 @NotNull 注释完全符合您的要求,但不幸的是它不能在 int 类型上执行,因为它不能是 null。为了使其工作,您需要将年龄更改为 Integer,然后在 spring 之后绑定值(如果两个参数均已传递并且它们具有验证将通过的值)。否则,如果它们以空值传递或根本未传递,则值将为 null 并且验证将失败。只需确保您没有 Person 的某些构造函数将属性初始化为某些值。

如果您不想更改它并使用 int,您可以将 HttpServletRequest request 添加到方法参数并检查是否存在参数 age

request.getParameter('age');

如果是null则根本没有传递任何参数。

提示:可能是你遗漏了一些配置,注释根本没有被处理,比如<mvc:annotation-driven/>@EnableWebMvc或者你可能遗漏了一个实际的像 Hibernate Validator 这样的验证器实现。如果没有您的配置样本,很难判断。