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>