具有多种类型的 REST PathParam

发布于 2024-11-07 08:57:37 字数 593 浏览 0 评论 0原文

我设置了一个 REST 服务来访问数据库中存储的信息。

我希望能够根据项目的 idname 进行访问。

假设我有一条记录,

name | id | description
mine | 65 | "my thing"

我希望能够通过以下任一方式访问此项目:

myurl.com/items/65
myurl.com/items/mine

我正在使用 Jersey(Java 库)。有没有一种方法可以定义 PathParam 来接受 int 或 String 而不使用 object.typeOf() ?

我想避免这种情况:

@PATH("/items/{identifier}
@GET
public String getItem(@PathParam("identifier") Object identifier){
     if(identifier.typeOf().equals(String.typeOf()))....

}

谢谢

I've got a REST service set up to access information stored in a database.

I'd like to be able to access based on either an item's id or name.

So lets say I've got a record

name | id | description
mine | 65 | "my thing"

I'd like to be able to access this item through either:

myurl.com/items/65
myurl.com/items/mine

I'm using Jersey (Java library). Is there a way I can define the PathParam to accept either an int or a String WITHOUT using object.typeOf()?

I'd like to avoid this:

@PATH("/items/{identifier}
@GET
public String getItem(@PathParam("identifier") Object identifier){
     if(identifier.typeOf().equals(String.typeOf()))....

}

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

渡你暖光 2024-11-14 08:57:37

如果您正在寻找一种“干净”的解决方案 - 我认为没有。但你可以这样做:

@PATH("/items/{identifier}")
public String getItem(@PathParam("identifier") String identifier){
   try {
       return getByID( Long.parseLong(identifier) );
   } catch (NumberFormatException ex) {
       return getByName( identifier );
   }
}

另外,这不会编译 - 没有像 typeOf() 这样的方法:

if(identifier.typeOf().equals(String.typeOf()))

我想你的意思是:

if (identifier instanceof String) 

编辑:无论如何,你最初的想法(将参数类型设置为Object,然后检查确切的实例类型)将不起作用;容器无法知道路径元素可能是整数,因此它不会尝试将其解析为整数,并且每次都会给您一个 String

If you're looking for a "clean" solution - I don't think there is one. But you could do this:

@PATH("/items/{identifier}")
public String getItem(@PathParam("identifier") String identifier){
   try {
       return getByID( Long.parseLong(identifier) );
   } catch (NumberFormatException ex) {
       return getByName( identifier );
   }
}

Also, this won't compile - there's no such method as typeOf():

if(identifier.typeOf().equals(String.typeOf()))

I think you meant:

if (identifier instanceof String) 

EDIT: And anyway, your original idea (setting the parameter type to Object, then checking for the exact instance type) won't work; the container has no way of knowing that the path element may be an integer, so it won't attempt to parse it as an integer, and it'll just give you a String every time.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文