查看原文
其他

SpringMVC表单验证器的使用

2017-09-24 javastack Java技术栈

本章讲解SpringMVC中怎么通过注解对表单参数进行验证。

SpringBoot配置

使用springboot, spring-boot-starter-web会自动引入 hiberante-validator, validation-api依赖。

WebMvcConfigurerAdapter实现类里面添加验证器及国际化指定资源文件。

  1. @Override

  2. public Validator getValidator() {

  3.    LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();

  4.    validator.setValidationMessageSource(messageSource());

  5.    return validator;

  6. }

  7. @Bean

  8. public MessageSource messageSource() {

  9.    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();

  10.    messageSource.setBasename("i18n/ValidationMessages");

  11.    messageSource.setDefaultEncoding(StandardCharsets.US_ASCII.name());

  12.    return messageSource;

  13. }

验证器使用

接收参数的表单类:

  1. public class LoginForm {

  2.    @NotNull(message = "{login.loginName.length}")

  3.    @Size(min = 4, max = 20, message = "{login.loginName.length}")

  4.    private String loginName;

  5.    @NotNull(message = "{login.loginPassword.length}")

  6.    @Size(min = 8, max = 20, message = "{login.loginPassword.length}")

  7.    private String loginPassword;

  8.    public String getLoginName() {

  9.        return loginName;

  10.    }

  11.    public void setLoginName(String loginName) {

  12.        this.loginName = loginName;

  13.    }

  14.    public String getLoginPassword() {

  15.        return loginPassword;

  16.    }

  17.    public void setLoginPassword(String loginPassword) {

  18.        this.loginPassword = loginPassword;

  19.    }

  20. }

在要验证的字段上面加入验证注解,更多参考 validation-apijar包下的 javax.validation.constraints包。

SpringMVC控制器:

  1. @PostMapping(value = "/login")

  2. public String login(@Validated LoginForm form) {

  3. ...

  4. }

使用 @Validated注解表示该参数需要验证。

国际化

message里面 {}引用的是国际化的资源。

添加国际化资源文件:

ValidationMessages.properties ValidationMessageszhCN.properties

需要指定编码为 ASCII,不然会乱码。

异常处理

异常全局处理时进行处理:

  1. @ControllerAdvice

  2. public class ExceptionResolver {

  3.    @ExceptionHandler(Throwable.class)

  4.    @ResponseBody

  5.    Object handleEntityException(HttpServletRequest request, Throwable ex) {

  6.        ...

  7.        if (ex instanceof BindException) {

  8.            BindException c = (BindException) ex;

  9.            List<ObjectError> errors = c.getBindingResult().getAllErrors();

  10.            StringBuilder errorMsg = new StringBuilder();

  11.            errors.forEach(x -> errorMsg.append(x.getDefaultMessage()).append(","));

  12.        }

  13.        ...

  14.    }

  15. }

或者在验证的类后面加 BindingResult,错误信息都会放在该对象里面,而不会抛出异常。如:

  1. @PostMapping(value = "/login")

  2. public String login(@Validated LoginForm form, BindingResult bindingResult) {

  3. ...

  4. }


Spring Boot教程请看本公众号Spring技术系列文章。


看完有没有收获?

分享到朋友圈给更多的人吧。




    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存