Mar 11, 2011 0
Best Practices: java.lang.NoSuchMethodError: javax.persistence.Persistence.getPersistenceUtil() JSR 303 Bean Validation and Hibernate validator
As soon as my form is submitted to be validated by Bean Validation facilities, i got the following exception:
java.lang.NoSuchMethodError: javax.persistence.Persistence.getPersistenceUtil()
After doing a little research i could solve the problem related to Persistence methods and Bean Validation (see Bean Validation JSR-303).
First of all, i needed to understand what the relation between Persistence and Validation is.
My Project includes Spring 3.1 and Hibernate 3.5 libraries. And i wanted to use JSR303 and annotations.
To enable Bean Validation facility in a spring project, Spring needs a default validator if you don’t give an explicit validator interface like this:
<mvc:annotation-driven validator="globalValidator"/>globalValidator is a global validator interface, bean, which the developer must provide. But, I wanted to just make my fields be validated according to annotations. For that reason i added into my config just:
<mvc:annotation-driven/>and added Hibernate-Validator 4.1 into my project.
(Solution) It seems that the Hibernate-Validator version 4.0 works only with J2EE 6 (JEE). Here is the stacktrace:
java.lang.NoSuchMethodError: javax.persistence.Persistence.getPersistenceUtil()Ljavax/persistence/PersistenceUtil;
at org.hibernate.validator.engine.resolver.JPATraversableResolver.isReachable(JPATraversableResolver.java:62)
at org.hibernate.validator.engine.resolver.DefaultTraversableResolver.isReachable(DefaultTraversableResolver.java:94)
at org.hibernate.validator.engine.resolver.SingleThreadCachedTraversableResolver.isReachable(SingleThreadCachedTraversableResolver.java:47)
at org.hibernate.validator.engine.ValidatorImpl.isValidationRequired(ValidatorImpl.java:757)
at org.hibernate.validator.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:324)
at org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForRedefinedDefaultGroup(ValidatorImpl.java:273)
at org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:256)
at org.hibernate.validator.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:210)
at org.hibernate.validator.engine.ValidatorImpl.validate(ValidatorImpl.java:119)
at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:86)
at org.springframework.validation.DataBinder.validate(DataBinder.java:692)
Here is the Persistence class API doc of J2EE5:
http://download.oracle.com/javaee/5/api/javax/persistence/Persistence.html
and PersistenceUtil has no such a method called getPersistenceUtil() while Persistence has this method in the sixth version:
http://download.oracle.com/javaee/6/api/javax/persistence/Persistence.html
Don’t use Hibernate-Validator 4.1 with J2EE5 otherwise you could get a headache.


