hibernate.validator.constraints.NotEmpty error when verifying request parameters java.lang.NoClassDefFoundError: javax/el/PropertyNot…

In the spring maven project, use hibernate validator to annotate the input parameter object of the formal verification method.

hibernate-validator version: 5.0.2.Final

validation-api version: 1.1.0.Final

There is an attribute named order_time in the model class annotated with @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;

/**
 * Scan QR code to pay Request Model
 * Created by Yunlong on 2017/6/1.
 */
public class QRCodeRequest extends BaseRequest {

    private static final long serialVersionUID = -3640955104188613350L;

    /**
     * order number
     */
    @NotNull(message = "order_no cannot be empty!")
    private String order_no;
    /**
     * Payment amount, in cents
     */
    @Min(value = 1,message = "pay_money minimum value 1!")
    public int pay_money;
    /**
     * The URL for receiving notifications from the payment center needs to be given an absolute path. The format within 255 characters is: http://wap.tenpay.com/tenpay.asp. Make sure that the payment center can access the address through http.
     */
    @URL(protocol="http",message="notify_urlInvalid URL address!")
    @NotNull(message = "notify_url cannot be empty!")
    private String notify_url;
    /**
     * Order time (format: yyyyMMddHHmmss)
     */<strong>
    @NotEmpty(message = "order_time cannot be empty!")
    </strong>private String order_time;
    /**
     * product name
     */
    @NotNull(message = "goods_name cannot be empty!")
    private String goods_name;
    /**
     * Remark
     */
    private String remark;
    /**
     * Valid for a few minutes
     */
    private String valid_minutes;
    /**
     * Payment channel Kubao Pay, Qingdao CITIC
     */
    @NotNull(message = "third_pay_platform cannot be empty!")
    private String third_pay_platform;
    /**
     * Payment channel type (12: WeChat scan code, 22: Alipay scan code)
     */
    @NotNull(message = "pay_channel cannot be empty!")
    private int pay_channel;
    
    //
    getter/setter (omitted)
    
}

BeanValidators tool class:

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) tool class.
 *
 * ConstraintViolation contains information such as propertyPath, message and invalidValue.
 * Provides various convert methods suitable for different i18n needs:
 * 1. List<String>, String content is message
 * 2. List<String>, String content is propertyPath + separator + message
 * 3. Map<propertyPath, message>
 *
 * See wiki for details: https://github.com/springside/springside4/wiki/HibernateValidator
 * @author calvin
 * @version 2013-01-15
 */
public class BeanValidators {

    /**
     * Call the validate method of JSR303 and throw ConstraintViolationException when verification fails.
     */
    @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());
        }

    }<br>}

Write the following testcase method:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/applicationContext.xml")
public class ValidatorTest {
    @Autowired
    private Validator validator;
    
    @Test
    public void notEmptyAttributeTest() throws Exception {
        QRCodeRequest pojo=new QRCodeRequest();
        pojo.setOrder_time("");
        
        try {
            BeanValidators.validateWithException(validator, pojo);
        } catch (RuntimeException e) {
            System.out.println("validerror:" + e.getMessage());
        }
    }
}

Executing testcase reports an error:

java.lang.NoClassDefFoundError: javax/el/PropertyNotFoundException

    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.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

Sometimes the following exception is reported =========================================

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

Solution:

  • I asked colleagues for help and tried to introduce jstl, but it didn’t work.
  • Properties should not be annotated with NotEmpty but should be annotated with NotBlank. (In fact, the verification item we need is NotBlank, not NotEmpty)
  • Refer to http://blog.csdn.net/bsg_24/article/details/49494975 and reduce the version of hibernate validator to 4.3.1.Final.