前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringMVC表单验证器的使用

SpringMVC表单验证器的使用

作者头像
Java技术栈
发布2018-03-30 14:35:42
1.7K0
发布2018-03-30 14:35:42
举报
文章被收录于专栏:Java技术栈Java技术栈

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

SpringBoot配置

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

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

代码语言:javascript
复制
@Override
public Validator getValidator() {
    LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
    validator.setValidationMessageSource(messageSource());
    return validator;
}

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("i18n/ValidationMessages");
    messageSource.setDefaultEncoding(StandardCharsets.US_ASCII.name());
    return messageSource;
}

验证器使用

接收参数的表单类:

代码语言:javascript
复制
public class LoginForm {

    @NotNull(message = "{login.loginName.length}")
    @Size(min = 4, max = 20, message = "{login.loginName.length}")
    private String loginName;

    @NotNull(message = "{login.loginPassword.length}")
    @Size(min = 8, max = 20, message = "{login.loginPassword.length}")
    private String loginPassword;

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getLoginPassword() {
        return loginPassword;
    }

    public void setLoginPassword(String loginPassword) {
        this.loginPassword = loginPassword;
    }

}

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

SpringMVC控制器:

代码语言:javascript
复制
@PostMapping(value = "/login")
public String login(@Validated LoginForm form) {
...
}

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

国际化

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

添加国际化资源文件:

ValidationMessages.properties ValidationMessageszhCN.properties

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

异常处理

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

代码语言:javascript
复制
@ControllerAdvice
public class ExceptionResolver {

    @ExceptionHandler(Throwable.class)
    @ResponseBody
    Object handleEntityException(HttpServletRequest request, Throwable ex) {
        ...
        if (ex instanceof BindException) {
            BindException c = (BindException) ex;
            List<ObjectError> errors = c.getBindingResult().getAllErrors();
            StringBuilder errorMsg = new StringBuilder();
            errors.forEach(x -> errorMsg.append(x.getDefaultMessage()).append(","));

        }
        ...
    }

}

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

代码语言:javascript
复制
@PostMapping(value = "/login")
public String login(@Validated LoginForm form, BindingResult bindingResult) {
...
}

看完有没有收获?

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SpringBoot配置
  • 验证器使用
  • 国际化
  • 异常处理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档