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:
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:
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:
1 2
| @Query("select site from Site site left join fetch site.tickets")
Stream<Site> getSiteByAddressAndTickets (String address); |