欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何解决Spring in action @valid验证不生效的问题

程序员文章站 2022-04-05 12:30:35
解决spring in action @valid验证不生效按照书上的示例代码来实现但是,添加了验证但是没有生效。spring提供了校验api是使用但是没有提供实现,所以需要自己导入实现包。所以导入实...

解决spring in action @valid验证不生效

按照书上的示例代码来实现但是,添加了验证但是没有生效。

spring提供了校验api是使用但是没有提供实现,所以需要自己导入实现包。

所以导入实现包:

<dependency>
            <groupid>org.hibernate</groupid>
            <artifactid>hibernate-validator</artifactid>
            <version>5.1.1.final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
        <dependency>
            <groupid>javax.validation</groupid>
            <artifactid>validation-api</artifactid>
            <version>1.1.0.final</version>
        </dependency>

但是还是没有解决问题,程序正常运行,校验不生效。

想到之前用maven来导入一些jar报的时候,还是会提示找不到(不知道是不是因为使用的xampp自带的tomcat的原因)。之前的解决办法就是把jar包丢到tomcat的lib文件夹下。

于是就把上面maven下载下来的两个jar包丢了进去,果然发生了一些变化,这次出现了报错,程序不能正常运行。

报错:

hibernate validator java.lang.noclassdeffounderror: could not initialize class org.hibernate.validator.internal.engine.configurationimpl

然后查找解决办法,在stack overflow上找到了解决办法,缺少org.jboss.logging和com.fasterxml classmate包,所以在maven中加入

  <dependency>
    <groupid>org.jboss.logging</groupid>
      <artifactid>jboss-logging</artifactid>
      <version>3.3.2.final</version>
  </dependency>
  <dependency>
      <groupid>com.fasterxml</groupid>
      <artifactid>classmate</artifactid>
      <version>1.3.4</version>
  </dependency>

但是还是没有解决问题,使用老办法,把这两个jar包丢到tomcat的lib文件夹下,问题解决。

最近遇到好多maven导入的包在运行的时候不生效的问题,就是不报错,但是运行的时候nodefclass错误。

找到解决办法:

springboot @validate不生效的原因

使用validate相关注解却没用生效的问题

public class loginrequest implements serializable {
    private static final long serialversionuid = 1l;
    @apimodelproperty(value = "手机号", required = true, example = "18888888")
    @pattern(regexp = regularconstants.phone, message = "手机号码格式错误")
    @jsonproperty(value = "phone")
    private string phone;
    @apimodelproperty(value = "密码", required = true, example = "1~[6,18]")
    @pattern(regexp = regularconstants.password, message = "密码格式错误,密码必须以字母开头,长度在6~18之间,只能包含字符、数字和下划线")
    private string password;
}

解决思路

引入hibernate相关依赖

       <dependency>
            <groupid>org.hibernate.validator</groupid>
            <artifactid>hibernate-validator</artifactid>
            <version>6.0.21.final</version>
        </dependency>
        <dependency>
            <groupid>javax.el</groupid>
            <artifactid>javax.el-api</artifactid>
            <version>3.0.0</version>
        </dependency>

相关配置

@configuration
public class validatorconfiguration {
    @bean
    public validator validator() {
        validatorfactory validatorfactory = validation.byprovider(hibernatevalidator.class)
                .configure()
                .addproperty("hibernate.validator.fail_fast", "true")
                .buildvalidatorfactory();
        return validatorfactory.getvalidator();
    }
}

全局拦截验证错误

@restcontrolleradvice
public class webglobalexceptionhandler {
//    private static final logger logger = loggerfactory.getlogger(globalexceptionhandler.class);
    /**
     * 拦截json参数校验
     */
//    @responsestatus(httpstatus.ok)
    @exceptionhandler(methodargumentnotvalidexception.class)
    public commonresult bindexception(methodargumentnotvalidexception e) {
        bindingresult bindingresult = e.getbindingresult();
        return commonresult.failed(exceptioncodeenum.validate_failed,objects.requirenonnull(bindingresult.getfielderror()).getdefaultmessage());
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。