我有两个不同的网址:
GET /stuff/{id} (where id is an Integer)
GET /stuff/foo?bar={someValue} (foo is not an Integer, it is a hard coded String)
调用/stuff/foo&bar=someValue
时,出现以下错误:
Failed executing GET /stuff/foo&bar=someValue
...
Caused by: java.lang.NumberFormatException: For input string: "foo&bar=someValue"
代码是:
@GET
@Path("/stuff/{id}")
public Response getById(@PathParam("id") int id) {
// code
}
@GET
@Path("/stuff/foo")
public Response foo(@QueryParam("bar") String bar) {
// code
}
我正在使用RESTEasy,我希望尽可能保留我的网址。显然,RESTEasy只是尝试使用foo方法的getById方法。
如何在RESTEasy中完成这项工作? (如果没有关于RESTEasy限制的详细解释),“更改您的URL”不是答案。我试过(确定)在getById之前放入foo代码,但我有同样的错误(当然)。
声明的URL之间是否有任何优先级概念?
作为一个注释:我已经在另一个框架(python-flask)中实现了这种URL,它工作得很好:你必须要小心在 / stuff之前声明/ stuff / foo / {id}(在更通用的情况之前的具体情况)。
编辑:我刚犯了一个愚蠢的错误!我打电话给/stuff/foo&bar=someValue
我应该打电话给/stuff/foo?bar=someValue
。谢谢@Scobal指出来了!
答案 0 :(得分:1)
您正在呼叫GET /stuff/foo&bar=someValue
您应该致电GET /stuff/foo?bar=someValue
RESTEasy正在尝试将foo&bar=someValue
解析为{id}
字段。
我不能给你一个关于RESTEasy URL优先级的答案,但你可以这样做:
@GET
@Path("/stuff/{id}")
public Response getById(@PathParam("id") String id, @QueryParam("bar") String bar) {
try {
int intId = Integer.parseInt(id);
// do int id things
} catch(NumberFormatException e) {
// do foo + bar things
}
}