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.