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 需求:

    1. List<String>, String 内容为 message
    1. List<String>, String 内容为 propertyPath + separator + message
    1. 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/PropertyNotFoundException

有时报下面异常 =========================================

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
java.lang.NoClassDefFoundError: javax/el/ELContext

 

解决办法:

  • 找同事协助,尝试引入 jstl,不奏效。
  • 属性不用 NotEmpty 注解,改用 NotBlank 注解。(其实,我们所需的验证项正是 NotBlank,而非 NotEmpty)
  • 参考 http://blog.csdn.net/bsg_24/article/details/49494975,将 hibernate validator 的版本降到 4.3.1.Final。