出现javax.validation.ValidationException: HV000183: Unable to initialize ‘javax.el.ExpressionFactory‘

前几天上线的一个内容,其中一个环节对json格式的字符串进行了参数校验,为了避免写重复的校验代码,使用了hibernate-validator的注解校验功能

添加的依赖如下:

<dependency>
	<groupId>org.hibernate.validator</groupId>
	<artifactId>hibernate-validator</artifactId>
	<version>6.1.5.Final</version>
</dependency>
<dependency>
	<groupId>org.glassfish</groupId>
	<artifactId>javax.el</artifactId>
	<version>3.0.0</version>
</dependency>

在开发、测试环境,都可以正常使用,在生产环境竟然报错了。。使用校验时直接报错了。完整的错误信息如下:

javax.validation.ValidationException: HV000183: Unable to initialize 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead
	at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.buildExpressionFactory(ResourceBundleMessageInterpolator.java:206)
	at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.<init>(ResourceBundleMessageInterpolator.java:94)
	at org.hibernate.validator.internal.engine.AbstractConfigurationImpl.getDefaultMessageInterpolator(AbstractConfigurationImpl.java:570)
	at org.hibernate.validator.internal.engine.AbstractConfigurationImpl.getDefaultMessageInterpolatorConfiguredWithClassLoader(AbstractConfigurationImpl.java:790)
	at org.hibernate.validator.internal.engine.AbstractConfigurationImpl.getMessageInterpolator(AbstractConfigurationImpl.java:480)
	at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.<init>(ValidatorFactoryImpl.java:151)
	at org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:38)
	at org.hibernate.validator.internal.engine.AbstractConfigurationImpl.buildValidatorFactory(AbstractConfigurationImpl.java:430)

查询网上大部分说的都是缺少依赖,添加hibernate-validator的依赖。
但是我的依赖包hibernate-validator-6.1.5.Final.jar、javax.el-3.0.0.jar都有的,而且版本也没有问题。

最后经过一位同事提醒,是不是有相同的类冲突了。
最后经过查找发现,第三方的依赖包,还存在一个el-api.jar,这个包中也有一个“javax.el.ExpressionFactory”类,全路径一模一样

el-api.jar中的“javax.el.ExpressionFactory”如下图:

el-api.jar中的ExpressionFactory

javax.el-3.0.0.jar中的“javax.el.ExpressionFactory”如下图:

javax.el-3.0.0.jar中的“javax.el.ExpressionFactory”

所以说,根本原因还是两个类重名导致类冲突。由于JVM类的加载顺序不一定,在开发环境与测试环境先加载的javax.el-3.0.0.jar,因此使用注解进行参数校验可以正常使用。但是生产环境先加载了el-api.jar,一使用注解进行校验就出现“Unable to initialize ‘javax.el.ExpressionFactory’”错误

另外,如果你找不到是与哪个包中的类冲突了,在linux主机上,第三方包的文件夹下,执行如下命令即可
参考链接: link.

find / -name "*.jar" -exec grep -Hsli 类名 {} \;
find . -name "*.jar" -exec grep -Hsli 'javax.el.ExpressionFactory' {} \;

如下是我的搜索结果
搜索结果

既然找到问题,那么就容易解决了。
方式一:如果有把握,直接删除el-api.jar包或依赖即可;
方式二:如果没把握,可以改动启动i脚本,在进程启动时优先加载 javax.el-3.0.0.jar

我使用的第二种方式,重新启动,完美解决

LIB=".:${FPATH}/lib/javax.el-3.0.0.jar:${FPATH}/lib/*:${FPATH}/core/*:${FPATH}/blib/*.jar"
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值