PayPay Open Payment API(OPA)とSpring Framework(旧)の相性問題

github.com

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以降の新しい言語機能を使用して作られたものを解釈できないということ。

www.infoq.com

そして、PayPayのSDKのソースを調べてみたところ、依存しているライブラリhibernate-validatorの中で、Stream APIが使われているということ。

githubの履歴をさかのぼって調べてみると、hibernate-validatorのバージョン6以降から、使われ始めている気がする。

f:id:ryu-htn:20210221210406p:plain

そこで、以下のように、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上での用途は、パラメータのバリデーション処理です。 パラメータを正しく設定できているなら、不要の処理なので、バリデーション処理ごと削除してしまっても動作上は問題ないと思われました。