@Valid、@Validated注解校验字段本机(windows,idea)调试有效,部署到服务器(linux)无效问题

今天终于把这个问题解决了,记录庆祝一下。

这周一,把开发完成的代码(本地调试通过的)部署到开发环境服务主机上。
模拟调用发现要求非空的字段(customerId)竟然没有被校验住,导致抛出了业务异常,没有抛出参数异常。
@NotBlank(message = “客户编码不能为空”)
private String customerId;
这个问题从周一 一直困扰到今天早上。在网上查询的大部分的说法都是方法入参前没有加@valid(或@validated),如下图:
在这里插入图片描述
但我代码中的确是有的;也不是嵌套的对象,就一层;或者有些人说的@Valid和@RequestBody位置调换一下(哪个注解在前在后都可以,与位置没关系)。

我的问题其实还有点不一样,我在本机用idea运行,参数是可以被校验住的,说明注解是有效的。但是,调用服务器上的服务时,注解就不好使了。甚至在服务器上参数(注解)校验失败后,我又在本机试了无数次,本机是校验通过的,但是服务器上的(注解校验)还是无效。
所以问题是本机@Valid、@Validated注解校验有效,但部署到linux主机上就无效了。

中间试了很多办法,重新修改代码(除了实现类的方法入参前加注解,接口的方法入参前也加注解),修改注解(@Valid改成@Validated),更换代码位置(参数bean与调用类放到统一包路径下)都不行,就差把本机的jdk(1.8.0_181)换成和服务器上jdk(1.8.0_144)的版本号相同的版本进行验证了。

今早突发奇想,把本机的启动日志与服务器上的启动日志拿出来对比一下,看看有没有什么不一样,这就发现问题了。如下图:
在这里插入图片描述
服务器上的启动日志中没有关于“hibernate.validator”包的任何关键信息,这可能就是问题所在,当时我猜是不是服务器上进程启动时,没有将“hibernate-validator-6.0.13.Final.jar”加载进去。
启动脚本中原来的加载第三方包的路径是这样写的
hibernate
该路径下也是有这个包的
在这里插入图片描述
所以我就改成了
LIB=" F P A T H / l i b / h i b e r n a t e − v a l i d a t o r − 6.0.13. F i n a l . j a r , {FPATH}/lib/hibernate-validator-6.0.13.Final.jar, FPATH/lib/hibernatevalidator6.0.13.Final.jar,{FPATH}/lib/,${FPATH}/core/"
重新启动服务器上的进程后,重新调用,终于参数被校验住了。
那发生这种事情的原因就与这个包有很大的关系了。

查询资料发现,spring-boot-starter-web-2.0.6.RELEASE.jar中依赖了hibernate-validator-6.0.13.Final.jar,如下图:
在这里插入图片描述
而我们项目中依赖了spring-boot-starter-web-2.0.6.RELEASE.jar这个包
在这里插入图片描述
因此项目中的POM中没有依赖hibernate-validator包也可以使用注解校验,没问题、不报错,在本机运行也还能校验非法入参。
但可能因为jar的版本冲突,或者版本冲突,导致在服务器上进程启动时,hibernate-validator包没有加载进去。
所以我们在项目的POM文件中直接加入依赖(算是强依赖吧),如下图:
在这里插入图片描述
重新打包,部署,重启,模拟调用。。。
非空字段(customerId)被校验(客户编码不能为空),成功。

虽然问题在困扰了几天后最终被解决,但还是有几点疑问,如果有清楚为什么的大佬还请赐教。

问题1:正常来说,A包依赖B包,B包依赖C包。那么A包是可以使用C包中的提供的各种工具的。但为什么我们项目依赖了spring-boot-starter-web-2.0.6.RELEASE.jar,spring-boot-starter-web-2.0.6.RELEASE.jar依赖了hibernate-validator-6.0.13.Final.jar,那么我们项目应该是可以使用@Valid注解的,但是为什么在服务器上就无效呢?只在本机上运行时有效?
问题2:发生这种情况,原因是jar包冲突吗?或者是其他原因?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值