IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Boot Java Discussion :

[r2dbc][spring-webflux][kotlin]problème de communication entre code et base données


Sujet :

Spring Boot Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2022
    Messages : 4
    Par défaut [r2dbc][spring-webflux][kotlin]problème de communication entre code et base données
    Salut tout le monde,

    code: https://github.com/cheroliv/develope...a2687305b26dec
    stacktrace: https://pastebin.com/hmnJed4m
    telecharger le code: archive
    command: Bonjour lorsque je n'arrive pas à insérer des élément dans ma base de données.
    mon entité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    package backend
     
    import org.springframework.data.annotation.Id
    import org.springframework.data.relational.core.mapping.Table
    import java.util.*
    import javax.validation.constraints.NotBlank
    import javax.validation.constraints.Positive
     
     
    /*=================================================================================*/
    @Table("`routes`")
    data class RouteEntity    (
        @Id var id: UUID? = null,
        @field:NotBlank
        var origin: String,
        @field:NotBlank
        var destination: String,
        @field:Positive
        var travel_time: Int,
    )
     
    val RouteEntity.toDomain: Route
        get() = Route(
            origin = origin,
            destination = destination,
            travel_time = travel_time
        )
    /*=================================================================================*/
    mon repository:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    package backend
     
    import kotlinx.coroutines.reactor.awaitSingle
    import org.springframework.data.r2dbc.core.R2dbcEntityTemplate
    import org.springframework.stereotype.Repository
     
     
    /*=================================================================================*/
    interface RouteRepository {
        suspend fun insertAll(routes: List<Route>)
    }
    /*=================================================================================*/
     
    @Repository
    class RouteRepositoryR2dbc(
        private val dao: R2dbcEntityTemplate
    ) : RouteRepository {
        override suspend fun insertAll(routes: List<Route>) {
            routes.map {
                dao.insert<RouteEntity>(
                    RouteEntity(
                        origin = it.origin,
                        destination = it.destination,
                        travel_time = it.travel_time
                    )
                ).awaitSingle()
            }
        }
    }
    /*=================================================================================*/
    mon service:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    package backend
     
    import backend.Constants.SPRING_PROFILE_CLI
    import com.fasterxml.jackson.databind.ObjectMapper
    import kotlinx.coroutines.runBlocking
    import org.springframework.beans.factory.annotation.Value
    import org.springframework.boot.CommandLineRunner
    import org.springframework.context.ApplicationContext
    import org.springframework.context.ApplicationContextAware
    import org.springframework.context.annotation.Profile
    import org.springframework.core.io.Resource
    import org.springframework.stereotype.Component
    import org.springframework.stereotype.Service
    import org.springframework.transaction.annotation.Transactional
    import javax.annotation.PostConstruct
     
     
    /*=================================================================================*/
     
    @Service
    @Transactional
    class RoadMapService(
        @Value("classpath:millennium-falcon.json")
        private val configurationFile: Resource,
        private val routeRepository: RouteRepository,
        private val mapper: ObjectMapper,
        private val context: ApplicationContext,
    ) {
     
        private suspend fun loadOnBoardComputerConfig() {
            //read json on classpath read ComputerConfig
            val conf: ComputerConfig = mapper.readValue(
                configurationFile.file, ComputerConfig::class.java
            )
            listOf(
                Route(origin = "Tatooine", destination = "Dagobah", travel_time = 6),
                Route(origin = "Dagobah", destination = "Endor", travel_time = 4),
                Route(origin = "Dagobah", destination = "Hoth", travel_time = 1),
                Route(origin = "Hoth", destination = "Endor", travel_time = 1),
                Route(origin = "Tatooine", destination = "Hoth", travel_time = 6),
            ).run {  routeRepository.insertAll(this) }
        }
     
        @PostConstruct
        private fun init() =  runBlocking { loadOnBoardComputerConfig() }
     
    }
    /*=================================================================================*/
    ma config database:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    package backend
     
    import io.r2dbc.spi.ConnectionFactory
    import org.springframework.beans.factory.annotation.Qualifier
    import org.springframework.context.annotation.Bean
    import org.springframework.context.annotation.Configuration
    import org.springframework.core.convert.converter.Converter
    import org.springframework.core.io.ClassPathResource
    import org.springframework.data.convert.CustomConversions.StoreConversions.of
    import org.springframework.data.convert.ReadingConverter
    import org.springframework.data.convert.WritingConverter
    import org.springframework.data.r2dbc.convert.R2dbcCustomConversions
    import org.springframework.data.r2dbc.convert.R2dbcCustomConversions.STORE_CONVERTERS
    import org.springframework.data.r2dbc.dialect.DialectResolver.getDialect
    import org.springframework.data.r2dbc.repository.config.EnableR2dbcRepositories
    import org.springframework.r2dbc.connection.R2dbcTransactionManager
    import org.springframework.r2dbc.connection.init.ConnectionFactoryInitializer
    import org.springframework.r2dbc.connection.init.ResourceDatabasePopulator
    import org.springframework.transaction.ReactiveTransactionManager
    import org.springframework.transaction.annotation.EnableTransactionManagement
    import org.springframework.transaction.reactive.TransactionalOperator
    import org.springframework.transaction.reactive.TransactionalOperator.create
    import java.time.Instant
    import java.time.LocalDateTime
    import java.time.LocalDateTime.ofInstant
    import java.time.ZoneOffset.UTC
    /*=================================================================================*/
     
    @Configuration
    @EnableTransactionManagement
    @EnableR2dbcRepositories("backend")
    class DatabaseConfiguration(
        private val properties: ApplicationProperties
    ) {
        @Bean
        fun inMemoryConnectionFactory(
            @Qualifier("connectionFactory")
            connectionFactory: ConnectionFactory
        ): ConnectionFactoryInitializer =
            ConnectionFactoryInitializer().apply {
                setConnectionFactory(connectionFactory)
                setDatabasePopulator(
                    ResourceDatabasePopulator(
                        ClassPathResource(properties.database.populatorPath)
                    )
                )
            }
     
        @Bean
        fun reactiveTransactionManager(
            connectionFactory: ConnectionFactory
        ): ReactiveTransactionManager = R2dbcTransactionManager(connectionFactory)
     
        @Bean
        fun transactionalOperator(
            reactiveTransactionManager: ReactiveTransactionManager
        ): TransactionalOperator = create(reactiveTransactionManager)
     
        @WritingConverter
        class InstantWriteConverter : Converter<Instant, LocalDateTime> {
            override fun convert(source: Instant): LocalDateTime? = ofInstant(source, UTC)!!
        }
     
        @ReadingConverter
        class InstantReadConverter : Converter<LocalDateTime, Instant> {
            override fun convert(localDateTime: LocalDateTime): Instant = localDateTime.toInstant(UTC)!!
        }
     
     
        @Bean
        fun r2dbcCustomConversions(
            @Qualifier("connectionFactory")
            connectionFactory: ConnectionFactory
        ): R2dbcCustomConversions {
            getDialect(connectionFactory).apply {
                return@r2dbcCustomConversions R2dbcCustomConversions(
                    of(
                        simpleTypeHolder,
                        converters.toMutableList().apply {
                            add(InstantWriteConverter())
                            add(InstantReadConverter())
                            addAll(STORE_CONVERTERS)
                        }
                    ), mutableListOf<Any>()
                )
            }
        }
     
    }
    /*=================================================================================*/
    Merci pour vos suggestions et n’hésiter pas a cloner le code pour tester.

  2. #2
    Membre chevronné
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 347
    Par défaut
    Bonjour,

    L'erreur est pourtant claire dans la stack trace:

    Table "ROUTES" not found (this database is empty);

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2022
    Messages : 4
    Par défaut
    lorsque je commente l'appel au repo dans mon service, alors j'ai ce log
    2022-09-28 18:22:09.254 DEBUG 2815 --- [ Test worker] o.s.r2dbc.connection.init.ScriptUtils : Executing SQL script from class path resource [db/tables.sql]
    2022-09-28 18:22:09.410 DEBUG 2815 --- [ Thread-21] o.s.r2dbc.connection.init.ScriptUtils : 0 returned as update count for SQL: CREATE TABLE IF NOT EXISTS routes ( id UUID default random_uuid() PRIMARY KEY, origin VARCHAR, destination VARCHAR, travel_time INT )
    2022-09-28 18:22:09.415 DEBUG 2815 --- [ Thread-21] o.s.r2dbc.connection.init.ScriptUtils : 0 returned as update count for SQL: CREATE UNIQUE INDEX IF NOT EXISTS unique_idx_origin_destination ON routes (origin, destination)
    2022-09-28 18:22:09.416 DEBUG 2815 --- [ Thread-21] o.s.r2dbc.connection.init.ScriptUtils : Executed SQL script from class path resource [db/tables.sql] in 162 ms.
    ce qui montre que mon script est bien executé, c'est lorsque j'utilise le repo que tout se gate.
    Si tu as vu une chose evident il faut m'orienter.
    Merci d'avoir pris le temps de me répondre

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    r2dbc:h2:mem:backend;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;DB_CLOSE_DELAY=-1
    essayez en ajoutant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DB_CLOSE_ON_EXIT=FALSE;

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2022
    Messages : 4
    Par défaut
    Merci pour le tuyau, mais c'est toujours la même chose.

    Je suis pris par le temps, et je ne peux pas rester scotché la dessus.
    Du coup je passe par une implementation de collection en memoire, histoire d'avancer sur le reste.
    Merci de votre participation à tous.
    Voici l'implem que je vais utiliser, et passe le sujet en resolu meme si c'est pas La solution.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    package backend
     
    import kotlinx.coroutines.reactor.awaitSingle
    import org.springframework.data.r2dbc.core.R2dbcEntityTemplate
    import org.springframework.stereotype.Repository
     
    /*=================================================================================*/
    interface RouteRepository {
        suspend fun saveAll(routes: List<Route>)
    }
    /*=================================================================================*/
     
    //@Repository
    class RouteRepositoryR2dbc(
        private val dao: R2dbcEntityTemplate
    ) : RouteRepository {
        override suspend fun saveAll(routes: List<Route>) {
            routes.map {
                dao.insert(RouteEntity(it))
                    .awaitSingle()
            }
        }
    }
     
    /*=================================================================================*/
    @Repository
    class RouteRepositoryInMemory : RouteRepository {
        object InMemoryData {
            private val routes: MutableList<Route> by lazy {
                emptyList<Route>().toMutableList()
            }
     
            @JvmStatic
            fun findAllRoutes(): List<Route> = routes
     
            @JvmStatic
            fun saveAll(routes: List<Route>) = InMemoryData.routes.addAll(routes)
     
        }
     
        override suspend fun saveAll(routes: List<Route>) {
            InMemoryData.saveAll(routes)
        }
    }
    /*=================================================================================*/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RMI] Problème de communication entre deux machines distantes
    Par georges_jung dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 10/04/2007, 18h03
  2. [c#] probléme de communication entre classe
    Par OpenGG dans le forum C#
    Réponses: 1
    Dernier message: 24/09/2006, 21h54
  3. Problème de communication entre php et Laszlo(Tomcat)
    Par YUN59 dans le forum Autres langages pour le Web
    Réponses: 1
    Dernier message: 21/07/2006, 13h45
  4. Problème de communication entre C# et ASP
    Par Prowlx dans le forum ASP
    Réponses: 1
    Dernier message: 19/07/2006, 17h37
  5. Problème de communications entre threads
    Par maya09 dans le forum Windows
    Réponses: 1
    Dernier message: 22/02/2006, 22h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo