2014-09-10 8 views
10

È possibile consentire al metodo di query @Params di essere facoltativo, in particolare nel caso di Spring Data REST?Spring Query Method con Optional @Param

Ad esempio, mi piacerebbe associare una ricerca molto simile allo stesso percorso di risorse. Per fare questo ora, avrei bisogno di qualcosa di simile a quanto segue:

@RestResource(path = "driver", rel = "byDriver") 
List<Bar> findByDriverId(@Param("id") String id, Pageable pageable); 

@RestResource(path = "driverAndSpan", rel = "byDriverAndSpan") 
List<Bar> findByDriverIdAndStartTimeGreaterThanEqualAndEndTimeLessThanEqual(@Param("id") String id, @Param("start") Date start, 
     @Param("end") Date end, Pageable pageable); 

che mi dà:

byDriver: { 
    href: "http://localhost:8080/foo/search/driver{?id,page,size,sort}", 
}, 
byDriverAndSpan: { 
    href: "http://localhost:8080/foo/search/driverAndSpan{?id,start,end,page,size,sort}", 
} 

Quello che voglio è quello di essere in grado di vedere qualcosa di simile alla seguente percorso, dove start e end sono parametri facoltativi, piuttosto che definire più metodi nel mio repository.

byDriverAndSpan: { 
    href: "http://localhost:8080/foo/search/driverAndSpan{?id,*start,*end,page,size,sort}", 
} 

che potrebbero apparire come:

@RestResource(path = "driverAndSpan", rel = "byDriverAndSpan") 
List<Bar> findByDriverIdAndStartTimeGreaterThanEqualAndEndTimeLessThanEqual(@Param("id") String id, @Param(value = "start", optional = true) Date start, 
     @Param(value = "end", optional = true) Date end, Pageable pageable); 
+0

Scavando un vecchio post ... Sono sorpreso che nessuno abbia menzionato [Querydsl] (http://www.querydsl.com/), che è esattamente quello che avresti potuto usare. –

risposta

0

No, questo non è attualmente supportato. Se fosse ci sarebbe il rischio di ambiguità. Potrebbe esserci lo scenario in cui l'url in entrata potrebbe corrispondere a più di 1 @RestResource.

Per spiegare da un punto di vista Java consente di dire che potuto definire due metodi:

getPerson(String firstName, int age); 

getPerson(String firstName, {Optional} int age, int phoneNumber); 

Ci sarebbero problemi quando qualcuno sta cercando di richiamare il secondo metodo, non fornendo età, ma di essere mappato il primo metodo con il numero di telefono letto come un'età.

+0

Come mai c'è rischio di ambiguità? I parametri hanno nomi (unici). – Nefreo

+0

Fornite i nomi dei parametri nella richiesta? – UserF40

+2

L'OP afferma che gli piacerebbe qualcosa sulla falsariga di 'http: // localhost: 8080/foo/search/driverAndSpan {? Id, * start, * end, page, size, sort}'. In questo caso i parametri sono forniti per nome, quindi non ci dovrebbe essere spazio per l'ambiguità. – Nefreo