如何验证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 这样的验证器实现。如果没有您的配置样本,很难判断。
这是我的开始代码:
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 这样的验证器实现。如果没有您的配置样本,很难判断。