javax.validation.ValidationException on Form.bindFromRequest()

918 views
Skip to first unread message

Carlo Polisini

unread,
Nov 26, 2013, 5:30:33 PM11/26/13
to play-fr...@googlegroups.com
I am using Play 2.2.1 with OrientDB (www.orientdb.org). 
After upgrading the Java drivers of OrientDB from 1.4.1 to 1.6.1 I get a javax.validation.ValidationException whenever 
Form.bindFromRequest() is called.
It seems that it is a Hibernate utility method, and most of Hibernate related jars are unchanged:
  <classpathentry kind="lib" path="/home/carlo/opt/play/repository/local/org.hibernate/hibernate-validator/5.0.1.Final/jars/hibernate-validator.jar"/>
  <classpathentry kind="lib" path="/home/carlo/opt/play/repository/local/javax.validation/validation-api/1.1.0.Final/jars/validation-api.jar"/>
  <classpathentry kind="lib" path="/home/carlo/opt/play/framework/../repository/cache/org.hibernate.javax.persistence/hibernate-jpa-2.0-api/jars/hibernate-jpa-2.0-api-1.0.0.Final.jar"/>

but, besides the upgrade of the OrientDB jars from 1.4.1 to 1.6.1, comparing the .classpath generated by 'play eclipse' only differences are:

Working Play .classpath:

<classpathentry kind="lib" path="/home/carlo/opt/play/framework/../repository/cache/net.java.dev.jna/jna/jars/jna-3.5.2.jar"/>
<classpathentry kind="lib" path="/home/carlo/opt/play/framework/../repository/cache/net.java.dev.jna/platform/jars/platform-3.5.2.jar"/>
- <classpathentry kind="lib" path="/home/carlo/opt/play/framework/../repository/cache/org.xerial.snappy/snappy-java/bundles/snappy-java-1.0.5.jar"/>

Not working Play classpath:

<classpathentry kind="lib" path="/home/carlo/opt/play/framework/../repository/cache/net.java.dev.jna/jna/jars/jna-4.0.0.jar"/>
<classpathentry kind="lib" path="/home/carlo/opt/play/framework/../repository/cache/net.java.dev.jna/jna-platform/jars/jna-platform-4.0.0.jar"/>
+ <classpathentry kind="lib" path="/home/carlo/opt/play/repository/local/net.java.dev.jna/platform/3.4.0/jars/platform.jar"/>

In attach complete classpath files.

The stacktrace is:

[info] c.o.o.o.j.OJPAPersistenceProvider - Can't parse 'META-INF/persistence.xml' :Something goes wrong while parsing persistence.xml
[error] play - Cannot invoke the action, eventually got an error: javax.validation.ValidationException: HV000041: Call to TraversableResolver.isReachable() threw an exception.
[error] application - 

! @6gd13a6b7 - Internal server error, for (POST) [/1/users/password/forgot] ->

play.api.Application$$anon$1: Execution exception[[ValidationException: HV000041: Call to TraversableResolver.isReachable() threw an exception.]]
at play.api.Application$class.handleError(Application.scala:293) ~[play_2.10.jar:2.2.1]
at play.api.DefaultApplication.handleError(Application.scala:399) [play_2.10.jar:2.2.1]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:261) [play_2.10.jar:2.2.1]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:261) [play_2.10.jar:2.2.1]
at scala.Option.map(Option.scala:145) [scala-library.jar:na]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2.applyOrElse(PlayDefaultUpstreamHandler.scala:261) [play_2.10.jar:2.2.1]
Caused by: javax.validation.ValidationException: HV000041: Call to TraversableResolver.isReachable() threw an exception.
at org.hibernate.validator.internal.engine.ValidatorImpl.isReachable(ValidatorImpl.java:1316) ~[hibernate-validator.jar:5.0.1.Final]
at org.hibernate.validator.internal.engine.ValidatorImpl.isValidationRequired(ValidatorImpl.java:1292) ~[hibernate-validator.jar:5.0.1.Final]
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:475) ~[hibernate-validator.jar:5.0.1.Final]
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:424) ~[hibernate-validator.jar:5.0.1.Final]
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:388) ~[hibernate-validator.jar:5.0.1.Final]
at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:340) ~[hibernate-validator.jar:5.0.1.Final]
Caused by: java.lang.UnsupportedOperationException: getProviderUtil
at com.orientechnologies.orient.object.jpa.OJPAPersistenceProvider.getProviderUtil(OJPAPersistenceProvider.java:80) ~[orientdb-object-1.6.1.jar:1.6.1]
at javax.persistence.Persistence$1.isLoaded(Persistence.java:78) ~[hibernate-jpa-2.0-api-1.0.0.Final.jar:1.0.0.Final]
at org.hibernate.validator.internal.engine.resolver.JPATraversableResolver.isReachable(JPATraversableResolver.java:56) ~[hibernate-validator.jar:5.0.1.Final]
at org.hibernate.validator.internal.engine.resolver.DefaultTraversableResolver.isReachable(DefaultTraversableResolver.java:130) ~[hibernate-validator.jar:5.0.1.Final]
at org.hibernate.validator.internal.engine.resolver.SingleThreadCachedTraversableResolver.isReachable(SingleThreadCachedTraversableResolver.java:46) ~[hibernate-validator.jar:5.0.1.Final]
at org.hibernate.validator.internal.engine.ValidatorImpl.isReachable(ValidatorImpl.java:1307) ~[hibernate-validator.jar:5.0.1.Final]
[info] c.o.o.o.j.OJPAPersistenceProvider - Can't parse 'META-INF/persistence.xml' :Something goes wrong while parsing persistence.xml
[info] c.o.o.o.j.OJPAPersistenceProvider - Can't parse 'META-INF/persistence.xml' :Something goes wrong while parsing persistence.xml

.classpath
.classpath-working

TonyB

unread,
Mar 7, 2014, 1:27:51 PM3/7/14
to play-fr...@googlegroups.com
Did you ever figure this out?  I'm having the same issue now.  This is a major problem!!!

When running .bindFromRequest() on a java bean in Play it throws this same exception.  I'm using OrientDB 1.7-rc1.  

I've tried with jna-3.4, with jna-4.0.0, and both at the same time.  Neither changed anything.  I think I need to use jna-4 in order for OrientDB to run correctly on Linux.

I looked in the OrientDB code and found this.
package com.orientechnologies.orient.object.jpa;

public class OJPAPersistenceProvider implements PersistenceProvider {

@Override
public ProviderUtil getProviderUtil() {
throw new UnsupportedOperationException("getProviderUtil");
}
}

which explains where the exception is coming from, ha!  But why is this getting called?  I don't know enough about JPA to figure it out.


Here is my full stacktrace, notice the orientdb-object-1.7-rc1.jar line.
[error] play - Cannot invoke the action, eventually got an error: javax.validation.ValidationException: HV000041: Call to TraversableResolver.isReachable() thre
w an exception.
[error] application -

! @6hf6hl5fk - Internal server error, for (POST) [/master/submitSmtp] ->

play.api.Application$$anon$1: Execution exception[[ValidationException: HV000041: Call to TraversableResolver.isReachable() threw an exception.]]
        at play.api.Application$class.handleError(Application.scala:293) ~[play_2.10.jar:2.2.1]
        at play.api.DefaultApplication.handleError(Application.scala:399) [play_2.10.jar:2.2.1]
        at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:261) [play_2.10.jar:2.2.1]

        at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:261) [play_2.10.jar:2.2.1]

        at scala.Option.map(Option.scala:145) [scala-library.jar:na]
        at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2.applyOrElse(PlayDefaultUpstreamHandler.scala:261) [play_2.10.jar:2.2.1]
Caused by: javax.validation.ValidationException: HV000041: Call to TraversableResolver.isReachable() threw an exception.
        at org.hibernate.validator.internal.engine.ValidatorImpl.isReachable(ValidatorImpl.java:1316) ~[hibernate-validator.jar:5.0.1.Final]
        at org.hibernate.validator.internal.engine.ValidatorImpl.isValidationRequired(ValidatorImpl.java:1292) ~[hibernate-validator.jar:5.0.1.Final]
        at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:475) ~[hibernate-validator.jar:5.0.1.Final]
        at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:424) ~[hibernate-validator.jar:5.0.1.Fina
l]
        at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:388) ~[hibernate-validator.jar:5.0.1.Fina
l]
        at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:340) ~[hibernate-validator.jar:5.0.1.Final]
Caused by: java.lang.UnsupportedOperationException: getProviderUtil
        at com.orientechnologies.orient.object.jpa.OJPAPersistenceProvider.getProviderUtil(OJPAPersistenceProvider.java:80) ~[orientdb-object-1.7-rc1.jar:1.7-rc
1]
        at javax.persistence.Persistence$1.isLoaded(Persistence.java:93) ~[hibernate-jpa-2.0-api.jar:1.0.1.Final]
        at org.hibernate.validator.internal.engine.resolver.JPATraversableResolver.isReachable(JPATraversableResolver.java:56) ~[hibernate-validator.jar:5.0.1.F
inal]
        at org.hibernate.validator.internal.engine.resolver.DefaultTraversableResolver.isReachable(DefaultTraversableResolver.java:130) ~[hibernate-validator.ja
r:5.0.1.Final]
        at org.hibernate.validator.internal.engine.resolver.SingleThreadCachedTraversableResolver.isReachable(SingleThreadCachedTraversableResolver.java:46) ~[h
ibernate-validator.jar:5.0.1.Final]
        at org.hibernate.validator.internal.engine.ValidatorImpl.isReachable(ValidatorImpl.java:1307) ~[hibernate-validator.jar:5.0.1.Final]
[error] application - [Global] Error: Execution exception[[ValidationException: HV000041: Call to TraversableResolver.isReachable() threw an exception.]]: POST
/master/submitSmtp


-Tony
Message has been deleted

TonyB

unread,
Mar 10, 2014, 2:10:55 PM3/10/14
to play-fr...@googlegroups.com
Hi Carlo,
Thanks for your input.  I'm in the same boat now.  I might be moving back to Postgresql too. OrientDB sounded too good to be true at first and I really had high hopes for it, but like you said it's just not there yet.  Too bad really, it seems like a great solution for my problem.  I just can't rely on it.  Bummed out :/
-Tony



On Saturday, March 8, 2014 2:57:59 AM UTC-8, Carlo Polisini wrote:
Hi Tony, I couldn't find a solution, this is why now we are stuck to version 1.4.1, since we had concurrency problems exceptions with 1.5.x and problem you are reporting since 1.6.x. 
Anyway we are planning to move from OrientDB, maybe reverting to a plain relation DB like PostgreSQL, since many stability problems and data corruptions, and in production environment, where you are dealing with money of people, you cant permit to play with an experimental project like this...it's a nice project, with good ideas but still not ready for production.

I think the only way is to not use Form object of play Framework, in our case, we could since we are using Play only as a REST API server and we are not using views, but if you do I think would be better to also post this problem to OrientDB group.


--
You received this message because you are subscribed to a topic in the Google Groups "play-framework" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/play-framework/ngO2lCF7qf4/unsubscribe.
To unsubscribe from this group and all its topics, send an email to play-framewor...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.



--
Carlo Polisini

Vyacheslav Rusakov

unread,
May 21, 2014, 1:04:15 AM5/21/14
to play-fr...@googlegroups.com
Hibernate validator looks if jpa is in classpath and if found it, starts to look if it can access fields during validation to avoid lazy init exceptions (pretty logical).
Orient-object brings jpa-api jar and so hibernate validator founds jpa and activate non dummy TraversableResolver impl.

All you need to do is to provide dummy implementation of javax.validation.TraversableResolver, which always returns true (for both methods).
Good implementation should finally appear here: org.hibernate.validator.internal.engine.ValidatorFactoryImpl.. just look how its configured and if you have access to configuration factory - substitute it there.
In worse case, it could be set with reflection (directly into org.hibernate.validator.internal.engine.ValidatorFactoryImpl#traversableResolver)
Can't show you exact solution, because i dont use play on backend..  just share general solution.. if its not too late for orient)

вторник, 11 марта 2014 г., 1:10:55 UTC+7 пользователь TonyB написал:

Carlo Polisini

unread,
May 27, 2014, 7:05:56 AM5/27/14
to play-fr...@googlegroups.com
Thanks for your help, I willtry to implement your solution with the new Orient release 1.7.

Carlo Polisini

unread,
Jun 6, 2014, 10:49:17 AM6/6/14
to play-fr...@googlegroups.com
I implement a custom TraversableResolver, but the point is that I don't know how to customize the Validator building since it is just loading the DefaultJPATraversableResolver included in hibernate. It seems that I should create a validation.xml file (http://docs.jboss.org/hibernate/validator/4.1/reference/en-US/html/validator-xmlconfiguration.html), I tried to create it pointing it to my custom traversableresolver, and put it under con/META-INF. But with no success, still I see that DefaultTraversable Resolver is loaded the hard-coded  DefaultTraversableResolver.JPA_AWARE_TRAVERSABLE_RESOLVER_CLASS_NAME. 

I saw also this other thread (https://groups.google.com/forum/#!topic/play-framework/mLDuZ_AsaQM), and maybe it is impossible to define a custom validation.xml in Play.

I know that the problem is because in OrientDB the class com.orientechnologies.orient.object.jpa.OJPAPersistenceProvider provide a fake implementation of getProviderUtil() 
public ProviderUtil getProviderUtil() {
throw new UnsupportedOperationException("getProviderUtil");
}
and I dont know why it is implemented in this way, but Play should allow to provide a custom validation.xml.

On Wednesday, May 21, 2014 7:04:15 AM UTC+2, Vyacheslav Rusakov wrote:
Reply all
Reply to author
Forward
0 new messages