2017-06-12 1 views
0

Ich versuche, zwei Rest Endpunkt mit der gleichen uri, aber verschiedene Arten. Die erste würde nach EAN (Int) suchen die zweite würde nach ID (String) suchen. Könnte ich irgendwie den Endpunkt überlasten? Ich benutze Spring Boot mit KotlinGleicher Rest Endpunkt mit verschiedenen PathVariable

Danach bekam ich eine Ausnahme, dass mehrere Methoden für den gleichen Endpunkt zugeordnet sind.

... NestedServletException: Anforderungsverarbeitung fehlgeschlagen; verschachtelte Ausnahme ist java.lang.IllegalStateException: Mehrdeutige Handler-Methoden für HTTP-Pfad zugeordnet ...

+0

Sie sollten zwei Mappings für das/book/byEan/{ean} und// book/byId/{id} erstellen –

Antwort

1

Ich fand heraus, dass die einzige Möglichkeit, es zu tun, Regex ist, wenn ich bei meiner API bleiben möchte.

Damit kann das von MongoDB erzeugte hexadezimale 24 Zeichen von den einfachen Zahlen unterschieden werden. Wenn jemand einen besseren Weg findet, lassen Sie es mich in Kommentaren wissen.

1

Aus Sicht von HTTP ist es derselbe Endpunkt wie es ist ein textbasiertes Protokoll und Pfadparameter ist immer eine Zeichenfolge. Daher löst Spring eine Ausnahme aus.

mit dem Problem befassen Sie entweder Argumente Art innerhalb Methode Körper identifizieren können:

@GetMapping("/book/{identifier}") 
fun getABookById(@PathVariable identifier: String) : ResponseEntity<*> { 
    try { 
     val id = identifier.toInt() 
     // id case 
     repository.getById(id)?.let { 
      return ResponseEntity.status(HttpStatus.OK).body(it) 
     } 
    } catch (e: NumberFormatException) { 
     // ean case 
     repository.getByEan(identifier)?.let { 
      return ResponseEntity.status(HttpStatus.OK).body(it) 
     } 
    } 
    throw ItemNotFoundException() 
} 

oder Pass ean oder id als @RequestParam wie/Buch ean = abcdefg,/Buch id = 5?.

1

Es ist nicht möglich, dies auf Mapping-Ebene zu tun. Wahrscheinlich sollten Sie versuchen, Wege wie:

/book/ean/{ean} 
/book/id/{id} 

Alternativ nur

/book/id/{someUniversalId} 

dann zwischen dem verschiedenen Arten von IDs in ausführbarem Code zu unterscheiden.

0

Es wäre vorteilhaft, ein Abfrage-Filter/Abfragekriterien zu entwickeln, so etwas wie zu verarbeiten:

/book?q=ean+eq+abcdefg (meaning ean=abcdefg) 
/book?q=id+gt+1000 (meaning id>1000) 

und so weiter.

Verwandte Themen