5
votes

Nouvelle erreur dans Spring Boot 2.3.0.RELEASE: UnsatisfiedDependencyException pour Oracle 12.2.0.1 jdbcdriver mais pas avec mysql jdbcdriver

Création d'un nouveau projet de démarrage avec juste jdbc et Oracle jdbc comme dépendances

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>

Je configure la source de données dans le fichier application.properties et lance cette application simple et elle bombe avec stacktrace ci-dessous.

2020-05-25 15: 07: 16.769 WARN 11840 --- [main] scaAnnotationConfigApplicationContext: Exception rencontrée lors de l'initialisation du contexte - annulation de la tentative d'actualisation: org.springframework.beans.factory.UnsatisfiedDependencyException: Erreur lors de la création du bean avec le nom 'jdbcConverter' défini dans ressource de chemin de classe [org / springframework / boot / autoconfigure / data / jdbc / JdbcRepositoriesAutoConfiguration $ SpringBootJdbcConfiguration.class]: Dépendance non satisfaite exprimée par le paramètre 4 de la méthode 'jdbcConverter'; l'exception imbriquée est org.springframework.beans.factory.BeanCreationException: Erreur lors de la création du bean avec le nom «jdbcDialect» défini dans la ressource de chemin de classe [org / springframework / boot / autoconfigure / data / jdbc / JdbcRepositoriesAutoConfiguration $ SpringBootJd.CassCiguration usine: usine de Bocassification instantanée] la méthode a échoué; l'exception imbriquée est org.springframework.beans.BeanInstantiationException: échec de l'instanciation de [org.springframework.data.relational.core.dialect.Dialect]: la méthode d'usine 'jdbcDialect' a levé l'exception; l'exception imbriquée est org.springframework.data.jdbc.repository.config.DialectResolver $ NoDialectException: impossible de déterminer un dialecte pour org.springframework.jdbc.core.JdbcTemplate@7fe083b1. Veuillez fournir un dialecte. 2020-05-25 15: 07: 16.769 INFO 11840 --- [main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Arrêt lancé ... 2020-05-25 15: 07: 17.023 INFO 11840 --- [main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Arrêt terminé. 2020-05-25 15: 07: 17.028 INFO 11840 --- [main] ConditionEvaluationReportLoggingListener:

Erreur lors du démarrage de ApplicationContext. Pour afficher le rapport sur les conditions, réexécutez votre application avec «débogage» activé. 2020-05-25 15: 07: 17.035 ERREUR 11840 --- [main] osboot.SpringApplication
: L'exécution de l'application a échoué

org.springframework.beans.factory.UnsatisfiedDependencyException: Erreur lors de la création du bean avec le nom 'jdbcConverter' défini dans la ressource de chemin de classe [org / springframework / boot / autoconfigure / data / jdbc / JdbcRepositoriesAutoConfiguration $ Spring DependiedJdbcCassdconfiguration par la méthode de configuration non satisfaisante. «paramètre 4; l'exception imbriquée est org.springframework.beans.factory.BeanCreationException: Erreur lors de la création du bean avec le nom «jdbcDialect» défini dans la ressource de chemin de classe [org / springframework / boot / autoconfigure / data / jdbc / JdbcRepositoriesAutoConfiguration $ SpringBootJd.CassCiguration usine: usine de Bocassification instantanée] la méthode a échoué; l'exception imbriquée est org.springframework.beans.BeanInstantiationException: échec de l'instanciation de [org.springframework.data.relational.core.dialect.Dialect]: la méthode d'usine 'jdbcDialect' a levé l'exception; l'exception imbriquée est org.springframework.data.jdbc.repository.config.DialectResolver $ NoDialectException: impossible de déterminer un dialecte pour org.springframework.jdbc.core.JdbcTemplate@7fe083b1. Veuillez fournir un dialecte. à org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray (ConstructorResolver.java:798) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] à org.springframework.beans.factory. support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:539) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] sur org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantowactory.instantowactory.instantowactory : 1338) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] sur org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1177) ~ [spring-beans- 5.2.6.RELEASE.jar: 5.2.6.RELEASE] à org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:557) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2 .6.RELEASE] sur org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.c reateBean (AbstractAutowireCapableBeanFactory.java:517) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] à org.springframework.beans.factory.support.AbstractBeanFactory.lambda $ doGetBean $ 0 (AbstractBeanFactory.java: 323) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] sur org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:226) ~ [spring-beans-5.2 .6.RELEASE.jar: 5.2.6.RELEASE] sur org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:321) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2. 6.RELEASE] sur org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:202) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] sur org.springframework. beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:895) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] à org.springframework.context.support.AbstractApplicationContext.finishB nFactoryInitialization (AbstractApplicationContext.java:878) ~ [spring-context-5.2.6.RELEASE.jar: 5.2.6.RELEASE] à org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:550) ~ [printemps -context-5.2.6.RELEASE.jar: 5.2.6.RELEASE] sur org.springframework.boot.SpringApplication.refresh (SpringApplication.java:758) [spring-boot-2.3.0.RELEASE.jar: 2.3.0 .RELEASE] sur org.springframework.boot.SpringApplication.refresh (SpringApplication.java:750) [spring-boot-2.3.0.RELEASE.jar: 2.3.0.RELEASE] sur org.springframework.boot.SpringApplication.refreshContext ( SpringApplication.java:397) [spring-boot-2.3.0.RELEASE.jar: 2.3.0.RELEASE] sur org.springframework.boot.SpringApplication.run (SpringApplication.java:315) [spring-boot-2.3.0 .RELEASE.jar: 2.3.0.RELEASE] sur org.springframework.boot.SpringApplication.run (SpringApplication.java:1237) [spring-boot-2.3.0.RELEASE.jar: 2.3.0.RELEASE] sur org. springframework.boot.SpringApplication.run (SpringApplication.java:1226) [spring-bo ot-2.3.0.RELEASE.jar: 2.3.0.RELEASE] sur net.sincera.dbmigration.liquibasedemo.LiquibasedemoApplication.main (LiquibasedemoApplication.java:21) [classes /: na] Causé par: org.springframework.beans. factory.BeanCreationException: Erreur lors de la création du bean avec le nom «jdbcDialect» défini dans la ressource de chemin de classe [org / springframework / boot / autoconfigure / data / jdbc / JdbcRepositoriesAutoConfiguration $ SpringBootJdbcConfiguration.class]: Échec de l'instanciation du bean via la méthode d'usine; l'exception imbriquée est org.springframework.beans.BeanInstantiationException: échec de l'instanciation de [org.springframework.data.relational.core.dialect.Dialect]: la méthode d'usine 'jdbcDialect' a levé l'exception; l'exception imbriquée est org.springframework.data.jdbc.repository.config.DialectResolver $ NoDialectException: impossible de déterminer un dialecte pour org.springframework.jdbc.core.JdbcTemplate@7fe083b1. Veuillez fournir un dialecte. à org.springframework.beans.factory.support.ConstructorResolver.instantiate (ConstructorResolver.java:656) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] à org.springframework.beans.factory. support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:636) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] à org.springframework.beans.factory.support.AbstraitAutowireCapableBeanFactory.jar: 5.2.6.RELEASE] à org.springframework.beans.factory.support.AbstraitAutowireCapableBeanFactory.inowableFactory.AbstraitAutowireCapableBeanFactory. : 1338) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] sur org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1177) ~ [spring-beans- 5.2.6.RELEASE.jar: 5.2.6.RELEASE] à org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:557) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2 .6.RELEASE] sur org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBea n (AbstractAutowireCapableBeanFactory.java:517) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] à org.springframework.beans.factory.support.AbstractBeanFactory.lambda $ doGetBean $ 0 (AbstractBeanFactory.java: 323) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] sur org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:226) ~ [spring-beans-5.2 .6.RELEASE.jar: 5.2.6.RELEASE] sur org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:321) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2. 6.RELEASE] sur org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:202) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] sur org.springframework. beans.factory.config.DependencyDescriptor.resolveCandidate (DependencyDescriptor.java:276) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] à org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultLista bleBeanFactory.java:1306) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] à org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:1226) ~ [spring -beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] à org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument (ConstructorResolver.java:885) ~ [spring-beans-5.2.6.RELEASE. jar: 5.2.6.RELEASE] sur org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray (ConstructorResolver.java:789) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE]. .. 19 cadres communs omis Provoqué par: org.springframework.beans.BeanInstantiationException: échec de l'instanciation de [org.springframework.data.relational.core.dialect.Dialect]: La méthode d'usine 'jdbcDialect' a levé une exception; l'exception imbriquée est org.springframework.data.jdbc.repository.config.DialectResolver $ NoDialectException: impossible de déterminer un dialecte pour org.springframework.jdbc.core.JdbcTemplate@7fe083b1. Veuillez fournir un dialecte. à org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate (SimpleInstantiationStrategy.java:185) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] à org.springframework.beans.factory. support.ConstructorResolver.instantiate (ConstructorResolver.java:651) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] ... 33 cadres communs omis Causé par: org.springframework.data.jdbc. repository.config.DialectResolver $ NoDialectException: impossible de déterminer un dialecte pour org.springframework.jdbc.core.JdbcTemplate@7fe083b1. Veuillez fournir un dialecte. sur org.springframework.data.jdbc.repository.config.DialectResolver.lambda $ getDialect $ 2 (DialectResolver.java:76) ~ [spring-data-jdbc-2.0.0.RELEASE.jar: 2.0.0.RELEASE] sur java .util.Optional.orElseThrow (Optional.java:290) ~ [nd: 1.8.0_241] sur org.springframework.data.jdbc.repository.config.DialectResolver.getDialect (DialectResolver.java:75) ~ [spring-data- jdbc-2.0.0.RELEASE.jar: 2.0.0.RELEASE] à org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration.jdbcDialect (AbstractJdbcConfiguration.java:144) ~ [spring-data-jdbc-2.0.0 .RELEASE.jar: 2.0.0.RELEASE] sur org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration $ SpringBootJdbcConfiguration $$ EnhancerBySpringCGLIB $$ 5730cfab.CGLIB $ jdbcDial. 0.RELEASE.jar: 2.3.0.RELEASE] à org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration $ SpringBootJdbcConfiguration $$ EnhancerBySpringCGLIB $$ 5730cfab $$ FastClassBy.Spring ~ 5730cfab $$ FastClassBy.bin 5 ~ une utoconfigure-2.3.0.RELEASE.jar: 2.3.0.RELEASE] à org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:244) ~ [spring-core-5.2.6.RELEASE.jar: 5.2 .6.RELEASE] sur org.springframework.context.annotation.ConfigurationClassEnhancer $ BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:331) ~ [spring-context-5.2.6.RELEASE.jar: 5.2.6.RELEASE] sur org.springframework .boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration $ SpringBootJdbcConfiguration $$ EnhancerBySpringCGLIB $$ 5730cfab.jdbcDialect () ~ [spring-boot-autoconfigure-2.3.0.RELEASE.jarect] .invoke0 (Méthode native) ~ [nd: 1.8.0_241] sur sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) ~ [nd: 1.8.0_241] sur sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.invoke) 43) ~ [na: 1.8.0_241] sur java.lang.reflect.Method.invoke (Method.java:498) ~ [na: 1.8.0_241] sur org.springframework.beans.factory.support.SimpleInstantiationStr ategy.instantiate (SimpleInstantiationStrategy.java:154) ~ [spring-beans-5.2.6.RELEASE.jar: 5.2.6.RELEASE] ... 34 cadres communs omis

Si j'exécute le code ci-dessus en utilisant spring boot 2.2.7.RELEASE, cela fonctionne très bien - sans exception !!

Après 2 jours, j'ai pensé à configurer une source de données mysql sur localhost. Le même programme fonctionne très bien (avec spring boot 2.3.0.RELEASE) mais cette fois, il a utilisé la source de données mysql.

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jdbc</artifactId>
    </dependency>

    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc8</artifactId>
        <version>12.2.0.1</version>
    </dependency>

Que se passe-t-il avec le pilote oracle jdbc dans Spring Boot 2.3.0.RELEASE?

Que fait correctement le pilote mysql jdbc dans Spring Boot 2.3.0.RELEASE?

Merci.


4 commentaires

Le problème est que Spring Data JDBC ne fournit pas de dialecte pour Oracle prêt à l'emploi. Voir le dialecte Spring Data JDBC Firebird non reconnu pour une solution (bien que vous devrez le modifier pour qu'il fonctionne pour Oracle).


Salut @MarkRotteveel: merci beaucoup. Je vous ai demandé sur ce post. Comment spring data jdbc 2.0 peut-il fournir un dialecte pour mysql mais pas pour oracle - est-ce que tout à coup le printemps est venu à reconnaître qu'ils ne veulent pas prendre en charge l'oracle très populaire hors de la boîte? OU est-ce un oubli?


Je ne sais pas, vous devriez poser cette question aux responsables de Spring Data JDBC.


Salut @MarkRotteveel, merci. Je les ai tweetés. En espérant les entendre après les vacances.


7 Réponses :


-1
votes

Cette configuration fonctionne bien dans ma configuration.

<dependencies>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <version>2.3.0.RELEASE</version>

</dependency>

    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc8</artifactId>
        <version>12.2.0.1</version>
    </dependency>
</dependencies>

public class Demo {
    private static String url = "jdbc:oracle:thin:user/pass@localhost:1521/XEPDB1";

    public static void main( String[] args ) {
        System.out.print( "Testing connection to database ..." );

        try {
            Connection conn = DriverManager.getConnection(url);
            System.out.println("OK");
            System.exit(0); // Prevent hang after completion when ran by mvn
        } catch (SQLException ignore) {
            System.out.println("ERROR: " + ignore);
            System.exit(1); // Prevent hang after completion when ran by mvn
        }
    }
}


2 commentaires

Cela n'utilise pas Spring Data JDBC.


Merci mais j'ai besoin d'utiliser des trucs de jdbc de données de printemps comme JdbcTemplate, etc. Pas de jdbc ordinaire.



10
votes

Que se passe-t-il avec le pilote oracle jdbc dans Spring Boot 2.3.0.RELEASE?

Le pilote JDBC fonctionne très bien.

Comme vous l'avez déjà appris dans les commentaires, le problème est que

a) Spring Data JDBC nécessite désormais un Dialect pour chaque base de données

b) Spring Data JDBC n'est pas livré avec un Dialect pour Oracle.

Le correctif:

Comme décrit dans Spring Data JDBC Firebird dialect non reconnu et dans https://spring.io/blog/2020/05/20/migrating-to-spring-data-jdbc-2-0, vous devez fournir votre propre droit d'implémentation Dialect maintenant.

Quelque chose comme ça devrait fonctionner:

class MyOracleDialect extends AnsiDialect {

    private static final LimitClause LIMIT_CLAUSE = new LimitClause() {

        @Override
        public String getLimit(long limit) {
            return String.format("FETCH NEXT %d ROWS ONLY", limit);
        }

        @Override
        public String getOffset(long offset) {
            return String.format("OFFSET %d ROWS", offset);
        }

        @Override
        public String getLimitOffset(long limit, long offset) {
            return String.format("OFFSET %d ROWS FETCH NEXT %d ROWS ONLY", offset, limit);
        }

        @Override
        public Position getClausePosition() {
            return Position.AFTER_ORDER_BY;
        }
    };

    @Override
    public LimitClause limit() {
        return LIMIT_CLAUSE;
    }

}

Vous devez ensuite rendre le Dialect disponible via un DialectProvider comme décrit dans la question Stackoverflow référencée:

Quelques informations générales:

Jusqu'à présent, l'équipe Spring Data n'exécute pas ses tests d'intégration avec une base de données Oracle. En effet, pendant un certain temps, il n'était pas clair comment le faire d'une manière légale puisque tout le code, y compris l'infrastructure de construction, était open source et Oracle avait besoin d'accepter toutes sortes de choses pour utiliser une instance de base de données ou son pilote.

À présent, les images Docker sont disponibles pour les tests et le pilote JDBC est disponible depuis Maven Central. C'est encore un peu délicat puisque les options actuelles pour les images docker que je connais vous permettent de choisir entre une taille d'image de plusieurs Go ou un temps de démarrage d'environ 15 minutes.

Quoi qu'il en soit, il y a un membre de la communauté qui travaille sur le problème: https://jira.spring.io/browse/DATAJDBC-256

Je suis donc convaincu que nous serons en mesure de prendre pleinement en charge Oracle dans un proche avenir.


4 commentaires

Pour autant que je sache, Oracle prend en charge la syntaxe SQL standard OFFSET / FETCH (voir ceci ), il devrait donc être possible d'utiliser AnsiDialect sans remplacer la clause limit.


@JensSchauder, merci pour l'explication détaillée. Mais mon attente du printemps et plus encore de la botte à ressort est que les choses fonctionnent hors de la boîte pour les choses les plus courantes. Et de nombreuses applications d'entreprise fonctionnent encore aujourd'hui sur Oracle db. Allez, Oracle, veuillez travailler avec Spring pour simplifier la vie des développeurs Oracle DB et Java. Nous savons que vous avez le bien des développeurs dans votre cœur!


@JensSchauder: Je vois que le problème est dans l'état RÉSOLU en mai. Qu'est-ce qui empêche Oracle d'être utilisé dans les tests d'intégration?


@anjanb Le problème a été résolu en juillet. Et les principaux problèmes que nous avons rencontrés sont décrits dans la section "Quelques informations générales" de la réponse.



1
votes

J'ai eu exactement le même problème la semaine dernière.

Le changement que j'ai effectué dans mon projet était plus simple: je viens de remplacer la dépendance HikariCP par tomcat-jdbc dans pom.xml:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
    <!-- HikariCP doesn't deals with jdbcDialect properly -->
    <exclusions>
        <exclusion>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
        </exclusion>
    </exclusions>
    <!-- Dependency removed -->
    </dependency>
    <!-- Dependency to tomcat-jdbc to deal with jdbcDialect -->
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jdbc</artifactId>
    </dependency>
    <!--...-->

Si j'annule cela, l'exception que vous avez publiée dans le titre se reproduit.

Bonne chance à toi.


1 commentaires

Merci @ user3634250 .. Compte tenu de la réponse ci-dessus, comment votre solution fonctionne-t-elle pour une application jdbc de données de printemps?



1
votes

Ces dépendances ont fonctionné pour moi.

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.2.6.RELEASE</version>
</parent>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
  </dependency>

<dependency>
  <groupId>com.oracle.database.jdbc</groupId>
  <artifactId>ojdbc8</artifactId>
  <version>19.6.0.0</version>
</dependency>


2 commentaires

Merci @Nirmala. Mais nous n'utilisons pas Oracle 19.x - nous utilisons Oracle 12 et 11 - je ne sais pas si l'utilisation d'une version ultérieure d'ojdbc.jar fonctionnera.


Vous utilisez 2.2.6.RELEASE et le fil est lié à 2.3.x.RELEASE ...



2
votes

Actuellement spring data jdbc ne prend pas en charge le dialecte oracle Vous devez définir votre propre résolveur de dialecte Ajoutez la classe suivante pour Oracle Dialect qui implémente JdbcDialectProvider .

org.springframework.data.jdbc.repository.config.DialectResolver$JdbcDialectProvider=com.mypackage.jdbctemplate.dialect.OracleDialectResolver //fuly qualified class name of your dialect resolver class

Enregistrez votre fournisseur en mettant un fichier spring.factories dans le dossier META-INF de votre chemin de classe et ajoutez la ligne suivante.

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Locale;
import java.util.Optional;

import org.springframework.data.jdbc.repository.config.DialectResolver.JdbcDialectProvider;
import org.springframework.data.relational.core.dialect.AnsiDialect;
import org.springframework.data.relational.core.dialect.Dialect;
import org.springframework.jdbc.core.ConnectionCallback;
import org.springframework.jdbc.core.JdbcOperations;

public class OracleDialectResolver implements JdbcDialectProvider {

    @Override
    public Optional<Dialect> getDialect(JdbcOperations operations) {
        return Optional.ofNullable(operations.execute((ConnectionCallback<Dialect>) OracleDialectResolver::getDialect));
    }

    private static Dialect getDialect(Connection connection) throws SQLException {
        DatabaseMetaData metaData = connection.getMetaData();
        String name = metaData.getDatabaseProductName().toLowerCase(Locale.ROOT);
        if (name.contains("oracle")) {
            return AnsiDialect.INSTANCE;
        }
        return null;
    }

}


1 commentaires

Merci. Savez-vous pourquoi? La réponse ci-dessus mentionne que c'est parce qu'Oracle DB n'est actuellement pas facilement disponible pour les tests unitaires.



5
votes

Ce résolveur de dialectes a résolu mon problème avec Oracle.

 @Configuration
   public class SpringDataJdbcConfiguration extends AbstractJdbcConfiguration {
    
        @Override
        public Dialect jdbcDialect(NamedParameterJdbcOperations operations) {
            return AnsiDialect.INSTANCE;
        }
    }


0 commentaires

0
votes

petite mise à jour de la réponse déjà publiée, pour oracle Dialect dans Build.gradle

import org.springframework.context.annotation.Configuration;
import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
import org.springframework.data.relational.core.dialect.OracleDialect;
import org.springframework.data.relational.core.dialect.Dialect;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;

@Configuration
public class SpringDataJdbcConfiguration extends AbstractJdbcConfiguration {

  @Override
  public Dialect jdbcDialect(NamedParameterJdbcOperations operations) {
    return OracleDialect.INSTANCE;
  }
}

puis créez sous la classe

implementation group: 'org.springframework.data', name: 'spring-data-relational', version: '2.1.1'


0 commentaires