PayPay Open Payment API(OPA)とSpring Framework(旧)の相性問題
PayPay決済のSDKを追加したところ、Tomcatが起動しないトラブルが発生しました。
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [************.class]; nested exception is java.lang.ArrayIndexOutOfBoundsException: 3145 at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:237) at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:204) at org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:84) at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1335) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1325) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:135) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:93) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334) at org.springframework.beans.
原因としては、古いバージョンのSpringフレームワークが、Java8以降の新しい言語機能を使用して作られたものを解釈できないということ。
そして、PayPayのSDKのソースを調べてみたところ、依存しているライブラリhibernate-validator
の中で、Stream APIが使われているということ。
githubの履歴をさかのぼって調べてみると、hibernate-validator
のバージョン6以降から、使われ始めている気がする。
そこで、以下のように、PayPay SDKの依存関係からhibernate-validator
を除外して、改めて、バージョン5系のhibernate-validator
を追加することで、エラーにならずに、Tomcatが起動しました。
でも、バージョン下げて、正常に動くのかどうか、それが怖いですね。
<dependency> <groupId>jp.ne.paypay</groupId> <artifactId>paypayopa</artifactId> <version>1.0.1</version> <exclusions> <exclusion> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </exclusion> <exclusion> <groupId>org.hibernate.validator</groupId> <artifactId> hibernate-validator-annotation-processor </artifactId> </exclusion> </exclusions> </dependency> <dependency> <!-- <groupId>org.hibernate.validator</groupId> --> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.3.4.Final</version> </dependency> <dependency> <!-- <groupId>org.hibernate.validator</groupId> --> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator-annotation-processor</artifactId> <version>5.3.4.Final</version> </dependency>
追記 正常に動かないことがわかりました。 hibernate-validator 5.3.4.Finalにはないクラスを使用しているので、実行時に、ClassNotFoundExceptionが発生します。 正攻法でいくなら、Spring Frameworkのバージョンアップ、または、APIを独自実装するしかありません。 しかし、あくまで裏の手でいきたいなら、PayPay決済のSDKを修正してしまうこともできます。 hibernate-validatorのSDK上での用途は、パラメータのバリデーション処理です。 パラメータを正しく設定できているなら、不要の処理なので、バリデーション処理ごと削除してしまっても動作上は問題ないと思われました。