对于在SpringMVC中实现的简单RESTfulJSONapi,我可以使用BeanValidation(JSR-303)来验证传递到处理程序方法中的路径变量吗?
例如:
@RequestMapping(value = "/number/{customerNumber}")
@ResponseBody
public ResponseObject searchByNumber(@PathVariable("customerNumber") String customerNumber) {
...
}
在这里,我需要使用Bean验证来验证customerNumber变量的长度。这在Spring MVC v3.x.x中是否可行?如果不可行,那么对于这种类型的验证,最好的方法是什么?
- 谢谢-谢谢
7条答案
按热度按时间ehxuflar1#
Spring不支援行程常式方法中
@PathVariable
注解参数上的@javax.validation.Valid
。有改善要求,但它仍是unresolved。最好的办法是只在处理程序方法体中进行自定义验证,或者考虑使用其他答案中建议的
org.springframework.validation.annotation.Validated
。axr492tv2#
您可以这样使用:使用
org.springframework.validation.annotation.Validated
可使RequestParam
或PathVariable
有效。步骤1初始化
ValidationConfig
step.2将
@Validated
添加到您的控制器处理程序类中,例如:step.3将
validators
添加到处理程序方法中:最后一步。将异常解析器添加到上下文:
tpxzln5u3#
解决方案很简单:
是的,PathVariables需要验证,就像任何用户输入一样。
fdx2calv4#
除了使用@PathVariable,您还可以利用SpringMVC的功能将路径变量Map到bean中:
Bean包含实际的验证规则:
确保路径变量(
{id}
)与bean字段(id
)相对应;r6hnlfcb5#
@PathVariable
并不意味着要通过验证才能将可读消息发送回用户。原则上,pathVariable不应无效。如果pathVariable无效,原因可能是:1.一个bug生成了一个错误的url(比如jsp中的href)。不需要
@Valid
,也不需要任何消息,只需修复代码即可;1.“the user”正在操作url。同样,不需要
@Valid
,不应该给用户任何有意义的消息。在这两种情况下,只要让异常气泡一直保持在上面,直到它被通常的Spring ExceptionHandlers捕获,以便生成一个漂亮的错误页面或一个有意义的json响应来指示错误。为了得到这个结果,你可以使用自定义编辑器进行一些验证。
创建一个
CustomerNumber
类,可能是不可变的(不需要实现一个CharSequence
,但允许您基本上像使用String
一样使用它)创建一个实现验证逻辑的编辑器(在本例中没有空格,长度固定,仅作为示例)
在控制器中注册编辑器
更改控制器方法的签名,接受
CustomerNumber
而不是String
(无论ResponseObject
是什么...)jljoyd4f6#
路径变量不能与系统中的任何Bean链接。要使用JSR-303注解来注解什么内容?要验证路径变量,应使用此方法Problem validating @PathVariable url on spring 3 mvc
mwecs4sa7#
您可以通过以下方法使用ConstraintViolationException中的字段来创建所需的答案;
您需要将@Validated注解添加到Controller类,并在路径变量字段之前添加任何验证注解