hibernate.validator.constraints.NotEmpty校验请求参数报错java.lang.NoClassDefFoundError: javax/el/PropertyNotFoundException
spring maven 项目,使用 hibernate validator 注解形式校验方法的入参对象。
hibernate-validator 版本:5.0.2.Final
validation-api 版本:1.1.0.Final
model 类中有个名为 order_time 的属性用 @NotEmpty 注解:
package com.emax.paycenter.dto.external;import org.hibernate.validator.constraints.NotEmpty;
import org.hibernate.validator.constraints.URL;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;/**
扫码支付 Request Model
Created by 云龙 on 2017/6/1.
*/
public class QRCodeRequest extends BaseRequest {private static final long serialVersionUID = -3640955104188613350L;
/**
- 订单号
*/
@NotNull(message = "order_no 不能为空!")
private String order_no;
/**- 支付金额,以分为单位
*/
@Min(value = 1,message = "pay_money 最小值 1!")
public int pay_money;
/**- 接收支付中心通知的 URL,需给绝对路径,255 字符内格式如:http://wap.tenpay.com/tenpay.asp,确保支付中心能通过 http 访问该地址
*/
@URL(protocol="http",message="notify_url 无效的 URL 地址!")
@NotNull(message = "notify_url 不能为空!")
private String notify_url;
/**- 订单时间(格式:yyyyMMddHHmmss)
*/
@NotEmpty(message = "order_time 不能为空!")
private String order_time;
/**- 商品名称
*/
@NotNull(message = "goods_name 不能为空!")
private String goods_name;
/**- 备注
*/
private String remark;
/**- 几分钟有效
*/
private String valid_minutes;
/**- 支付渠道 酷宝支付, 青岛中信
*/
@NotNull(message = "third_pay_platform 不能为空!")
private String third_pay_platform;
/**- 支付通道类型(12:微信扫码,22:支付宝扫码)
*/
@NotNull(message = "pay_channel 不能为空!")
private int pay_channel;//
getter/setter (略)}
BeanValidators 工具类:
package com.emax.paycenter.utils;import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.Validator;
import java.util.Set;/**
JSR303 Validator(Hibernate Validator) 工具类.
ConstraintViolation 中包含 propertyPath, message 和 invalidValue 等信息.
提供了各种 convert 方法,适合不同的 i18n 需求:
- List<String>, String 内容为 message
- List<String>, String 内容为 propertyPath + separator + message
- Map<propertyPath, message>
详情见 wiki: https://github.com/springside/springside4/wiki/HibernateValidator
@author calvin
@version 2013-01-15
*/
public class BeanValidators {/**
- 调用 JSR303 的 validate 方法, 验证失败时抛出 ConstraintViolationException.
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void validateWithException(Validator validator, Object object, Class<?>... groups)
throws ConstraintViolationException {
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);
if (!constraintViolations.isEmpty()) {
StringBuffer sb=new StringBuffer();
for (ConstraintViolation constraintViolation : constraintViolations) {
sb.append(constraintViolation.getMessage());
}
throw new RuntimeException(sb.toString());
}}
}
编写如下 testcase 方法:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:spring/applicationContext.xml") public class ValidatorTest { @Autowired private Validator validator;@Test </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> notEmptyAttributeTest() <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> Exception { QRCodeRequest pojo</span>=<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> QRCodeRequest(); <span style="background-color: rgba(255, 255, 0, 1)">pojo.setOrder_time(</span></span><span style="background-color: rgba(255, 255, 0, 1)">""<span style="color: rgba(0, 0, 0, 1)">); </span></span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> { BeanValidators.validateWithException(validator, pojo); } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (RuntimeException e) { System.out.println(</span>"validerror:" +<span style="color: rgba(0, 0, 0, 1)"> e.getMessage()); } }
}
执行 testcase 报错:
java.lang.NoClassDefFoundError: javax/el/PropertyNotFoundException
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolateExpression(ResourceBundleMessageInterpolator.java:</span>227<span style="color: rgba(0, 0, 0, 1)">)
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolateMessage(ResourceBundleMessageInterpolator.java:</span>187<span style="color: rgba(0, 0, 0, 1)">)
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolate(ResourceBundleMessageInterpolator.java:</span>120<span style="color: rgba(0, 0, 0, 1)">)
at org.springframework.validation.beanvalidation.LocaleContextMessageInterpolator.interpolate(LocaleContextMessageInterpolator.java:</span>49<span style="color: rgba(0, 0, 0, 1)">)
at org.hibernate.validator.internal.engine.ValidationContext.interpolate(ValidationContext.java:</span>370<span style="color: rgba(0, 0, 0, 1)">)
at org.hibernate.validator.internal.engine.ValidationContext.createConstraintViolation(ValidationContext.java:</span>284<span style="color: rgba(0, 0, 0, 1)">)
at org.hibernate.validator.internal.engine.ValidationContext.createConstraintViolations(ValidationContext.java:</span>246<span style="color: rgba(0, 0, 0, 1)">)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateSingleConstraint(ConstraintTree.java:</span>289<span style="color: rgba(0, 0, 0, 1)">)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:</span>133<span style="color: rgba(0, 0, 0, 1)">)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateComposingConstraints(ConstraintTree.java:</span>233<span style="color: rgba(0, 0, 0, 1)">)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:</span>102<span style="color: rgba(0, 0, 0, 1)">)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:</span>91<span style="color: rgba(0, 0, 0, 1)">)
at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:</span>85<span style="color: rgba(0, 0, 0, 1)">)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:</span>478<span style="color: rgba(0, 0, 0, 1)">)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:</span>424<span style="color: rgba(0, 0, 0, 1)">)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:</span>388<span style="color: rgba(0, 0, 0, 1)">)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:</span>340<span style="color: rgba(0, 0, 0, 1)">)
at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:</span>158<span style="color: rgba(0, 0, 0, 1)">)
at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:</span>199<span style="color: rgba(0, 0, 0, 1)">)
at com.emax.paycenter.utils.BeanValidators.validateWithException(BeanValidators.java:</span>39<span style="color: rgba(0, 0, 0, 1)">)
at com.emax.paycenter.backend.dao.mapper.ValidatorTest.notEmptyAttributeTest(ValidatorTest.java:</span>50<span style="color: rgba(0, 0, 0, 1)">)
at ...
Caused by: java.lang.ClassNotFoundException: javax.el.PropertyNotFoundException
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 48 more
有时报下面异常 =========================================
java.lang.NoClassDefFoundError: javax/el/ELContext at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolateExpression(ResourceBundleMessageInterpolator.java:227) at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolateMessage(ResourceBundleMessageInterpolator.java:187) at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolate(ResourceBundleMessageInterpolator.java:120) at org.springframework.validation.beanvalidation.LocaleContextMessageInterpolator.interpolate(LocaleContextMessageInterpolator.java:49) at org.hibernate.validator.internal.engine.ValidationContext.interpolate(ValidationContext.java:370) at org.hibernate.validator.internal.engine.ValidationContext.createConstraintViolation(ValidationContext.java:284) at org.hibernate.validator.internal.engine.ValidationContext.createConstraintViolations(ValidationContext.java:246) at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateSingleConstraint(ConstraintTree.java:289) at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:133) at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateComposingConstraints(ConstraintTree.java:233) at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:102) at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:91) at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:85) at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:478) at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:424) at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:388) at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:340) at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:158) at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:199) at com.emax.paycenter.utils.BeanValidators.validateWithException(BeanValidators.java:39) at com.emax.paycenter.backend.dao.mapper.ValidatorTest.notEmptyAttributeTest(ValidatorTest.java:50) at ... Caused by: java.lang.ClassNotFoundException: javax.el.ELContext at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355)at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 48 more
解决办法:
- 找同事协助,尝试引入 jstl,不奏效。
- 属性不用 NotEmpty 注解,改用 NotBlank 注解。(其实,我们所需的验证项正是 NotBlank,而非 NotEmpty)
- 参考 http://blog.csdn.net/bsg_24/article/details/49494975,将 hibernate validator 的版本降到 4.3.1.Final。