4 votes

ne parvient pas à faire fonctionner la combinaison de JDK 11, Spring Boot y compris la persistance, et JavaFX

J'utilise le JDK 11. Mon projet a commencé comme un projet Spring Boot avec persistance, et j'ai d'abord eu toutes les classes de données câblées et couvertes par des tests. Maintenant, je veux utiliser JavaFX pour l'interface graphique, ce qui signifie commencer à utiliser le système de modules Java. L'application (squelette de code ci-dessous) démarre à moitié mais s'interrompt à cause de la pile d'exceptions suivante :

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'spring.jpa-org.springframework.boot.autoconfigure.orm.jpa.JpaProperties': Lookup method resolution failed

Caused by: java.lang.IllegalStateException: Failed to introspect Class [org.springframework.boot.autoconfigure.orm.jpa.JpaProperties] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@6c3708b3]

Caused by: java.lang.NoClassDefFoundError: javax/sql/DataSource

Caused by: java.lang.ClassNotFoundException: javax.sql.DataSource

L'information sur le module ressemble actuellement à ceci :

requires java.persistence;
requires javafx.controls;
requires spring.boot;
requires spring.boot.autoconfigure;
requires spring.context;
requires spring.core;

exports mypackage.app;
opens mypackage.app;

Et voici la source Java (légèrement rétrécie) de l'application principale :

package mypackage.app;

@SpringBootApplication
public class MyApplication extends Application {

    private static String[] arguments;

    private ConfigurableApplicationContext applicationContext;

    public static void main(String[] args) {
        arguments = args;
        launch(args);
    }

    @Override
    public void init() throws Exception {
        applicationContext = SpringApplication.run(MyApplication.class, arguments);
    }

    @Override
    public void start(Stage stage) throws Exception {
        var label = new Label("xyz");
        var scene = new Scene(new StackPane(label), 640, 480);
        stage.setScene(scene);
        stage.show();
    }

    @Override
    public void stop() {
        applicationContext.stop();
    }

}

Edit.

Ajout d'un requires java.sql; à l'info module conduit à une pile différente d'exceptions, reproduite ici :

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed

javax.persistence.PersistenceException: Unable to resolve persistence unit root URL

java.io.FileNotFoundException: class path resource [] cannot be resolved to URL because it does not exist

Edit.

Comme indiqué ailleurs en ajoutant le java.xml.bind La dépendance a réglé le problème de l'URL racine de l'unité de persistance, pour le remplacer par une nouvelle pile d'exceptions :

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed

java.lang.NoClassDefFoundError: net/bytebuddy/matcher/ElementMatchers

java.lang.ClassNotFoundException: net.bytebuddy.matcher.ElementMatchers

5voto

haupz Points 206

Les éléments suivants module-info.java aborde la question :

requires java.persistence;
requires java.sql;
requires java.xml.bind;
requires javafx.controls;
requires net.bytebuddy;
requires spring.boot;
requires spring.boot.autoconfigure;
requires spring.context;
requires spring.core;
requires spring.data.jpa;

exports mypackage.app;
opens mypackage.app;

En résumé, les dépendances qui devaient être ajoutées étaient les suivantes java.sql , spring.data.jpa , java.xml.bind et net.bytebuddy . En outre, le paquet d'applications devait être ouvert et exporté au moyen des deux dernières lignes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X