bNd*_*bNd 5 java spring spring-validator
当我使用BindingResult同@Validated一个方法的注释,验证无法正常工作。如果我BindingResult从方法参数中删除,它工作正常。我用过@ControllerAdvice。
知道为什么它不起作用吗?
我的代码如下:
public ResponseEntity<?> dologin(
@Validated({ Group.Login.class }) @RequestBody User user,
BindingResult errors)
{
// somecode
}
Run Code Online (Sandbox Code Playgroud)
根据验证、数据绑定和类型转换文档,任何验证消息都将自动添加到绑定器的BindingResult.
去掉不会有影响吧?
由于您只提供了控制器方法中的代码,因此我添加了一些在 Spring 4 应用程序中进行验证所需的附加信息,以便您可以看到可能存在的差异。我至少假设以下内容:
@RequestMapping(method = RequestMethod.POST)
public String dologin(@Valid @ModelAttribute("userForm") User user, final BindingResult bindingResult) throws Exception
Run Code Online (Sandbox Code Playgroud)
@RequestMapping(method = RequestMethod.POST)
public String dologin(@Validated @ModelAttribute("userForm") User user, final BindingResult bindingResult) throws Exception
Run Code Online (Sandbox Code Playgroud)
或者,如果使用验证组:
@RequestMapping(method = RequestMethod.POST)
public String dologin(@Validated({ User.Login.class }) @ModelAttribute("userForm") User user, final BindingResult bindingResult) throws Exception
Run Code Online (Sandbox Code Playgroud)
@NotBlank(message = "{firstName.required}")
@Size(min = 2, max = 24, message = "{firstName.size}")
@Pattern(regexp = "^[’' \\.\\-\\p{L}\\p{M}]*$", message = "{firstName.format}")
private String firstName;
Run Code Online (Sandbox Code Playgroud)
或者,如果使用验证组:
public interface Login extends Default {}
@NotBlank(message = "{firstName.required}", groups = {Login.class})
@Size(min = 2, max = 24, message = "{firstName.size}", groups = {Login.class})
@Pattern(regexp = "^[’' \\.\\-\\p{L}\\p{M}]*$", message = "{firstName.format}", groups = {Login.class})
private String firstName;
Run Code Online (Sandbox Code Playgroud)
src/main/resources:firstName.required=First name is required.
firstName.size=First name must be between {min} and {max} characters long.
firstName.format=First name may contain only letters, apostrophes, spaces and hyphens.
Run Code Online (Sandbox Code Playgroud)
确保您的Bean 验证规范版本与您的实现版本相匹配。Bean Validation API 2.0于 2017 年 8 月发布。 Bean Validation 2.0 参考实现是Hibernate Validation Engine 6.0。
验证错误将添加到BindingResult方法参数中是否存在。或者,您可以使用Errors代替BindingResult- API 本质上是相同的。在我上面的实现中,这两个工作等效。
但是,如果我将参数从我的控制器方法中删除,我会看到(从日志记录中)触发了验证并引发了适当的错误,并且我的消息键到其属性的映射成功,但我的服务器错误页面被呈现我预期的观点。有关此参数要求的其他信息,请参阅有关BindingResult/Errors 参数的相关问题。
Aug 31, 2017 2:21:56 PM com.test.spring.controller.ErrorController handleException
SEVERE: Server Error
org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors
Field error in object 'userForm' on field 'firstName': rejected value []; codes [Size.userForm.firstName,Size.firstName,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userForm.firstName,firstName]; arguments []; default message [firstName],24,2]; default message [First name must be between 2 and 24 characters long.]
Field error in object 'userForm' on field 'firstName': rejected value []; codes [NotBlank.userForm.firstName,NotBlank.firstName,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userForm.firstName,firstName]; arguments []; default message [firstName]]; default message [First name is required.]
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:117)
Run Code Online (Sandbox Code Playgroud)
我在上述所有组合中都看到了非常一致的行为。
我注意到的一个区别是您@ControllerAdvice在示例中使用。我的大多数控制器使用@Controller注释(本地控制器错误),而不是@ControllerAdvice(用于全局错误,例如渲染 HTTP 404 或 500 错误页面)。请参阅此相关问题/答案以了解@ControllerAdvice.
在上面的错误日志中,ErrorController如果我省略BindingResult/Errors参数,您会看到这是报告验证错误的那个,而且确实这是我的控制器类使用@ControllerAdvice注释而不是@Controller. 通过@ControllerAdvice在您的登录控制器上使用,您可能会干扰正常的错误处理。
由于您使用的是特定 于Hibernate 的@Validated组验证注释而不是JSR-303/349/380规范@Valid注释,因此您使用的实现之间可能存在一些差异(我猜是版本 5,它符合 API 1.1)。我使用的是 6.0.2 版,它符合新的(2017 年 8 月)Bean Validation Framework API 2.0。
| 归档时间: |
|
| 查看次数: |
6546 次 |
| 最近记录: |