Spring-Boot-Starter-Data-JPA mit JDK11

Fehlerbild

Beim Starten einer Spring Boot Anwendung unter JDK11 (Java 11 Umgebung) kommt es zu einer Fehlermeldung. Es betrifft auch das letzte Release 2.0.4.RELEASE.

Caused by: java.lang.NullPointerException: null
    at javassist.util.proxy.SecurityActions.setAccessible(SecurityActions.java:103) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.DefineClassHelper.toClass3(DefineClassHelper.java:151) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.DefineClassHelper.toClass2(DefineClassHelper.java:134) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:95) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.FactoryHelper.toClass(FactoryHelper.java:131) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.ProxyFactory.createClass3(ProxyFactory.java:530) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.ProxyFactory.createClass2(ProxyFactory.java:515) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.ProxyFactory.createClass1(ProxyFactory.java:451) ~[javassist-3.22.0-GA.jar:na]
    at javassist.util.proxy.ProxyFactory.createClass(ProxyFactory.java:422) ~[javassist-3.22.0-GA.jar:na]
    at org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.postInstantiate(JavassistProxyFactory.java:75) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:162) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:156) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:58) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    ... 46 common frames omitted

Ohne Änderung läuft die Anwendung unter JDK10 fehlerfrei.

Ursache der NullPointerException

Diese lässt sich auf einen Fehler in javassist zurückführen. Siehe issue 194 für weitere Informationen.

Fehler wurde in neuer GA gefixt

Der Fehler in javassist wurde mit 3.23.1-GA behoben. Als Workaround (dieser kann unerwünschte Seiteneffekte besitzen) kann man die Dependency in dem POM überschreiben.

Gradle

Mit Gradle muss bei der Verwendung des Spring Boot Dependencies Management Plugins im Abschnitt Dependencies javassist eingefügt werden. Das Einfügen überschreibt die impleziete Abhängigkeit von Spring-Boot-Data-JPA.

dependencies {
    // Override javassist version 3.22.0-GA from spring-boot-starter-data-jpa.
    // This fixes javassist runtime error with JDK11.
    // See https://github.com/jboss-javassist/javassist/issues/194
    compile('org.javassist:javassist:3.23.1-GA')
}

Mit gradle dependencies kann die Änderung leicht geprüft werden:

./gradlew clean dependencies | grep javassist
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
\--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA
|    |    +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA
+--- org.javassist:javassist:3.23.1-GA