Transazioni e sottorisorse con JAX-RS

2

Sto eseguendo il porting di un'API RESTful di un'applicazione esistente su un framework web Java - non mi interessa davvero quale - ma è difficile ottenere le basi giuste.

Il nocciolo del problema sembra essere il ponte tra JAX-RS e il database in modo che le transazioni funzionino. L'API usa molto subresources e il modo in cui JAX-RS sembra funzionare implica la restituzione di un nuovo localizzatore. Questo è un buon modello, ma significa che non esiste un vincolo efficace sulla transazione, quindi le annotazioni @Transactional diventano un problema. Mi piacerebbe che fossero soddisfatti in qualche modo della richiesta, ma nessuno dei framework che ho provato sembra renderlo così facile, o persino possibile.

È una specie di problema con tre corpi. Posso fare transazioni e query bene spingendole in un livello di repository, ma poi non dovrei usare subresources. O posso fare subresources e anche query piacevolmente ma poi non c'è nulla di bello per le transazioni. Fondamentalmente posso avere due transazioni, sottorisorse e query complesse, ma ho bisogno di tutte e tre le cose.

Finora, ho provato a farlo funzionare con Guice + Jersey + Querydsl e con Spring Data e Spring REST. Sembrano tutti interamente basati sull'idea che ciascun endpoint possa essere @Transactional e (di solito) che sia una semplice API CRUD sulle tabelle. Ho un front-end molto bello già costruito. e non vedo alcun motivo valido per riscriverlo completamente perché Java rende i servizi difficili da creare.

So che in qualche modo ho bisogno di ottenere le transazioni legate alla richiesta, e comunque uso DTO, quindi sono contento di ciò, ma non riesco a trovare alcun modo per farlo. Qualcuno ha utili indicazioni, modelli, consigli?

    
posta Stuart Watt 20.02.2015 - 18:09
fonte

1 risposta

1

Se JAX-RS non è un requisito, ti suggerisco di consultare Restlet . Utilizza l'architettura del trasportatore, quindi le risorse di nidificazione in altre risorse non sono un problema - vedi URI gerarchici . Quando si integra con Spring , in genere si definisce root SpringBeanRouter , in cui si inseriscono risorse effettive, in ognuno dei quali è possibile inserire un altro router e così via.

Puoi racchiudere ogni metodo di ogni risorsa semplicemente definendo la richiesta di livello superiore filtro , che potrebbe utilizzare il modello di transazione di Spring o qualcosa di simile. Oppure, poiché non ti è richiesto di restituire i locator, puoi semplicemente andare con l'annotazione @Transactional sui metodi di (sotto) risorse.

Vedi pacchetto org.restlet.ext.spring per i dettagli.

    
risposta data 21.02.2015 - 08:00
fonte

Leggi altre domande sui tag