Одним из способов решения этой проблемы является то, что вы, вероятно, можете использовать захват регулярного выражения в своем @ javax.ws.rs.Path.
@Path("people/{id:[^/]+?}{format:(\\.[^/]*?)?}")
@GET
public MySubResource getPeople(@PathParam("id") String id, @PathParam("format") String format) {
// remove the "." from the start of "format" if it is not null
return new MySubResource(id, format);
}
Тогда в вашем подресурсе:
public abstract class MySubResource {
final protected String format;
protected MySubResource(String id, String format) {
this.format = format;
}
protected abstract Results getResults();
@GET
public Response get() {
return Response.ok(getResults(), this.format).build();
}
}
Будьте осторожны с регулярными выражениями. Я привел пример, но вы можете захотеть сжать выражение, чтобы убедиться, что ничего не проскальзывает.
Еще один способ решить эту проблему - изменить место захвата вашего {id} и использовать там регулярное выражение. Вместо @Path("id") MySubResource public getPeople(@PathParam("id") String id)
захвата идентификатора, удалите захват идентификатора из getPeople () и измените MySubResource следующим образом:
@Path("people")
public MySubResource getPeople() {
return new MyPeopleSubResource();
}
public abstract class MySubResource {
protected abstract Results getResults();
@GET
@Path("{id}")
public Results get() { return getResults(); }
@GET
@Path("{id}.xml")
public Response getXml() {
return Response.ok(getResults(), MediaType.TEXT_XML_TYPE).build();
}
@GET
@Path("{id}.html")
public Response getHtml() {
return Response.ok(getResults(), MediaType.TEXT_HTML_TYPE).build();
}
}
В любом случае возможны компромиссы в зависимости от того, как организованы ваши структуры данных и когда вам нужно знать параметр «id». Я не особенно люблю регулярные выражения, потому что их действительно сложно понять, но в этом случае это возможно.