GAEでSpringのValidation機能を使おうとしてハマった

GAE上でSpringMVCを動かしています。formからの入力にValidationを試してみました。で、どっぷりハマったので、とりあえず原因を速報。

“hibernate-validator 5.*” don’t work on GAE!!

————————————————————–

使っている環境

Java JDK1.6.0_35(64bit版)
Google App Engine SDK for Java 1.7.1
Eclipse IDE for Java EE Developers_ Juno (4.2)64Bit版
The Google Plugin for Eclipse, for Eclipse 3.8/4.2 (Juno)
Spring Framework 3.2.2.RELEASE
Commons Collections 3.2.1
Commons Lang 2.6
Commons Logging 1.1.2
Apache Velocity 1.7
hibernate-validator-4.3.0.Final ( + jboss-logging-3.1.0.CR2.jar, validation-api-1.0.0.GA.jar)


(1)NG編

まず、現時点での最新版である、
hibernate-validator 5.0.0.Final
を使ってみました。I try to use latest version “hibernate-validator 5.0.0.Final”.

ダウンロード先はこちら。
Downloads – JBoss Community

ダウンロードしたhibernate-validator-5.0.0.Final-dist.tar.gzの中にある、
hibernate-validator-5.0.0.Final.jar
validation-api-1.1.0.Final.jar
jboss-logging-3.1.1.GA.jar

をライブラリに追加して、アプリ起動、以下のエラーが出ました。NoClassFoundError has occured.

java.lang.NoClassDefFoundError: com/fasterxml/classmate/Filter

こちらのサイトから
SpringSource Enterprise Bundle Repository

FasterXML ClassMate 0.5.4をダウンロードして、com.springsource.com.fasterxml.classmate-0.5.4.jarをライブラリに追加しました。
アプリ起動してみると、またエラーが出ました。NoClassFoundError has occured again !

java.lang.ClassNotFoundException: de.odysseus.el.ExpressionFactoryImpl

そのため、今度はこちらのサイトから、
Java Unified Expression Language

juel-2.2.6をダウンロードしてきて、juel-impl-2.2.6.jarをライブラリに追加しました。
そうすると、アプリが正常に起動するようになりました。

しかし!

実際にValidation機能を作動させると、INTERNAL_SERVER_ERRORが発生。
このような謎のエラーが出てました。InternalServerError has occured !!

java.lang.ExceptionInInitializerError
    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)
   :   :
   :   :

Caused by: javax.el.ELException: Could not create expression factory instance
    at javax.el.ExpressionFactory.newInstance(ExpressionFactory.java:225)
    at javax.el.ExpressionFactory.newInstance(ExpressionFactory.java:183)
    at javax.el.ExpressionFactory.newInstance(ExpressionFactory.java:89)
    at org.hibernate.validator.internal.engine.messageinterpolation.InterpolationTerm.<clinit>(InterpolationTerm.java:60)
    ... 68 more
Caused by: java.security.AccessControlException: access denied (java.io.FilePermission C:\Program Files\Java\jdk1.6.0_35\jre\lib\el.properties read)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
    at java.security.AccessController.checkPermission(AccessController.java:546)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:283)
    at java.lang.SecurityManager.checkRead(SecurityManager.java:871)
    at java.io.File.exists(File.java:731)
    at de.odysseus.el.ExpressionFactoryImpl.loadDefaultProperties(ExpressionFactoryImpl.java:258)
    at de.odysseus.el.ExpressionFactoryImpl.loadProperties(ExpressionFactoryImpl.java:283)
    at de.odysseus.el.ExpressionFactoryImpl.<init>(ExpressionFactoryImpl.java:162)
    at de.odysseus.el.ExpressionFactoryImpl.<init>(ExpressionFactoryImpl.java:147)
   :   :
   :   :

el.propertiesとかいうファイルのことをいろいろ調べたものの、情報少なく、原因不明。

おそらく、de.odysseus.el.ExpressionFactoryImplがファイルを読み込もうとしている。で、GAEではファイルの読み書きは禁止されているのでエラーとなっている。
I think “juel-2.2.6” try to read el.properties. But, on GAE, it doesn’t permit to read files. So Error has occured. I don’t know Why “juel” try to read.

しかし、SpringのTutorialをみると、きちんと動いている!
But , according to “SpringTutorial”,  It’s work well !
Spring Security in Google App Engine | SpringSource Team Blog


(2)Success!!
最終的に分かったのは、どうもhibernate-validator-5.*からちょっとつくりが変わっているみたい。
I think that  hibernate-validator-5.* has changed any architecture.

hibernate-validator-4.3.0.Finalを使ったらうまく動くようになりました。
I try to use “hibernate-validator-4.3.0.Final”, it’s work well !!
Don’t use “hibernate-validator-5.*” on GAE !!  Use “hibernate-validator-4.3.0″

また、hibernate-validator-4.3.0を使った場合、FasterXML、juelは無くてもOKです。
You don’t need “FasterXML and juel”, when you use “hibernate-validator-4.3.0” on GAE.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s