Ist es möglich, JAX-RS-Methode mit variablen Anzahl von URI-Parametern zu konfigurieren?
-
26-09-2019 - |
Frage
ist es möglich, zu konfigurieren GET-Methode variable Anzahl von URI-Parametern zu lesen und interpretieren sie entweder als variable Argument (Array) oder eine Sammlung? Ich weiß, Abfrageparameter kann als Liste / Satz gelesen werden, aber ich kann nicht für sie in meinem Fall gehen.
Z. B:.
@GET
@Produces("text/xml")
@Path("list/{taskId}")
public String getTaskCheckLists(@PathParam("taskId") int... taskId) {
return Arrays.toString(taskId);
}
Vielen Dank im Voraus
Lösung
Wenn ich Ihre Frage richtig verstanden hat, kann die @Path
Annotation einen regulären Ausdruck nimmt eine Liste von Pfadkomponenten zu spezifizieren. Zum Beispiel so etwas wie:
@GET
@Path("/list/{taskid:.+}")
public String getTaskCheckLists(@PathParam("taskid") List<PathSegment> taskIdList) {
......
}
Es gibt ein ausführlicheres Beispiel hier .
Andere Tipps
Ich reiche dies nicht als Antwort, wie es nur ein Rand Fall auf der ist derzeit Antwort angenommen, das, was ich habe auch verwendet.
In meinem Fall (Jersey 1.19) /list/{taskid:.+}
würde für den Rand Fall von Null variablen Parametern nicht. Ändern des RegEx zu /list/{taskid:.*}
sorgte dafür. Siehe auch diesem Artikel (das scheint anwendbar zu sein).
Darüber hinaus auf den regulären Ausdruck zu Mächtigkeit Indikatoren *
zu wechseln (statt +
) Ich hatte auch programmatisch mit dem Fall von leeren Saiten zu behandeln, wie ich die List<PathSegment>
in eine List<String>
übersetzen würde (es passiere in meinen DB-Zugangscode ).
Der Grund, warum ich von PathSegment
zu String
bin zu übersetzen ist, dass ich nicht eine Klasse aus dem javax.ws.rs.core
Paket wollte meine Data Access Layer Code verschmutzen.
Hier ist ein komplettes Beispiel:
@Path("/listDirs/{dirs:.*}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response listDirs(@PathParam("dirs") List<PathSegment> pathSegments) {
List<String> dirs = new ArrayList<>();
for (PathSegment pathSegment: pathSegments) {
String path = pathSegment.getPath();
if ((path!=null) && (!path.trim().equals("")))
dirs.add(pathSegment.getPath());
}
List<String> valueFromDB = db.doSomeQuery(dirs);
// construct JSON response object ...
}