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 Java Discussion :

Utilisation de Stream Java 8 dans un service [Data]


Sujet :

Spring Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Utilisation de Stream Java 8 dans un service
    Bonjour à tous 👋

    J'essaye vainement depuis quelques jours d'utiliser un stream dans un service REST. Seulement j'ai toujours l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    You're trying to execute a streaming query method without a surrounding transaction that keeps the connection open so that the Stream can actually be consumed. Make sure the code consuming the stream uses @Transactional or any other way of declaring a (read-only) transaction.] with root cause
    org.springframework.dao.InvalidDataAccessApiUsageException: You're trying to execute a streaming query method without a surrounding transaction that keeps the connection open so that the Stream can actually be consumed. Make sure the code consuming the stream uses @Transactional or any other way of declaring a (read-only) transaction.
    J'ai bien mis annoter ma méthode en Transactional, mais ça n'a pas résolu mon problème.

    Je suis à la recherche d'une solution à mon problème.
    Voici ma configuration :
    Srping-boot : 2.0.0.RELEASE
    Java : 1.8.0_152

    Et le code de mon controller :
    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
    @Controller
    public class SiteController {
        private static final Logger log = LoggerFactory.getLogger(SiteController.class);
     
        @Autowired
        private SiteRepository repo;
     
     
        @RequestMapping("/site")
        @Transactional(readOnly = true)
        ResponseEntity<Collection<Ticket>> printTicketsOfSite(@RequestParam(value = "address") String siteAddress) {
            if (siteAddress == null) return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
            if (siteAddress.isEmpty()) return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
            Collection<Ticket> tickets = new HashSet<>();
            try (Stream<Site> sites = repo.getSiteByAddressAndTickets(siteAddress)) {
                sites.forEach(site -> {
                    tickets.addAll(site.getTickets());
                });
            }
            if (tickets.isEmpty()) return new ResponseEntity<>(HttpStatus.NOT_FOUND);
            return new ResponseEntity<>(tickets, HttpStatus.FOUND);
        }
    }
    Et celui de mon interface de DAO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @Query("select site from Site site left join fetch site.tickets")
    Stream<Site> getSiteByAddressAndTickets (String address);

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    Par défaut
    Citation Envoyé par BourSb Voir le message
    J'ai bien mis annoter ma méthode en Transactional, mais ça n'a pas résolu mon problème.
    Et si l'erreur vous dit qu'il n'y a pas de transaction, c'est donc que l'annotation n'a pas été respectée...
    et donc que vous avez un problème de configuration : @Transactional est réalisé par un aspect de Spring,
    c'est donc que l'aspect n'est pas appliqué à votre @Controller, probablement parce que votre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <tx:annotation-driven />
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @EnableTransactionManagement
    n'a pas été mis au bon endroit (ou pas du tout),
    càd dans le bon contexte Spring : et servlet context != application context.

    De toute façon, il est préférable de mettre vos @Transactional dans votre couche Repository/DAO
    pour mieux gérer les exceptions (à la fois leur conversion via @Repository et le rollback qu'elles doivent provoquer),
    en mettant @Transactional sur vos points d'entrée du @Controller, à terme vous n'allez que vous attirer des ennuis.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Bonsoir,

    Merci beaucoup pour la réponse, et désolé du retards pour mon retours.
    J'ai bien noté votre conseil et mettrais les annotation @Transactional dans ma couche DAO.

    Je suis débutant en J2E et avec Spring . Je ne sais pas trop comment configurer mon serveur et de ce que j'ai trouvé sur internet il faut que je prépare mes objet de DAO.

    Au vu de la complexité, je vais utiliser des listes simples et non des Stream afin de me simplifier la tache.

    Merci encore pour votre réponse.

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

Discussions similaires

  1. Utilisation d'un autre projet dans un service
    Par drakon1991 dans le forum C#
    Réponses: 6
    Dernier message: 01/09/2017, 16h43
  2. Utiliser un Dll delphi 2009 dans mon service Web
    Par Zalathorn dans le forum Services Web
    Réponses: 1
    Dernier message: 21/07/2009, 16h49
  3. Utilisation d'un code C dans Java
    Par Goduak dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 27/04/2007, 12h09
  4. Utilisation du BDE dans un service système
    Par dbb_is dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/03/2007, 16h49
  5. [Delphi7]Utilisation d'un fichier ini dans un service web
    Par Tcheby dans le forum Web & réseau
    Réponses: 4
    Dernier message: 25/09/2006, 09h07

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