@Path和正则表达式(Jersey/REST)

raf*_*ira 23 java regex rest jersey

我在REST项目中使用Jersey,我需要使用正则表达式.

挖掘它很简单,如:

@Path("/resources")
public class MyResource {

   @GET
   @Path("{subResources:.*}")
   public String get(@PathParam("subResources") String subResources) {...}
}
Run Code Online (Sandbox Code Playgroud)

但是,这样做,只有当我传递1个参数时,该方法才会获取请求,例如:

GET:.../resources/firstSubResource

如果我使用多于1个参数,则该方法无法获取请求,例如:

GET:.../resources/firstSubResource/seccondSubResource/thirdSubResource


如果我的@Path包含变量文本值,我只能使用正则表达式,例如:

@Path("{SubResource1}/{subResources:.*}")
Run Code Online (Sandbox Code Playgroud)

要么

@Path("/hardCodeString/{subResources:.*}")
Run Code Online (Sandbox Code Playgroud)

今天我可以运行这个变量的解决方案,但对于我的观点来说并不是oK.


我的web.xml

(...)
    <servlet>
        <servlet-name>Jersey Spring Web Application</servlet-name>
        <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.myproject.rest</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Spring Web Application</servlet-name>
        <url-pattern>/1.0/*</url-pattern>
    </servlet-mapping>
(...)
Run Code Online (Sandbox Code Playgroud)

  • 有没有人使用过相关的东西?
  • 我做错了什么?
  • 我认为这可能是一个错误,当使用多个@Path,一个在Class中,另一个在Method中.
  • 任何提示表示赞赏!

问候

jag*_*aga 21

您可以尝试使用JAX-RS 1.1概述中给出的正则表达式

对于您的案例,代码段如下所示

@Path("resources/")
public class MyResource {

   @GET
   @Path("{subResources: [a-zA-Z0-9_/]+}")
   public String get(@PathParam("subResources") String subResources) {...}
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.


pau*_*lth 9

我知道这是一个非常古老的问题,但我在尝试为自己寻找解决方案时遇到过它.我试图接受s3样式的文件名,例如/folder/whatever/blah/.../image.jpg,它可以是任何可以想象的长度并且包含许多/s.

无论如何你自己的解决方案

@Path("/hardCodeString/{subResources:.*}")
Run Code Online (Sandbox Code Playgroud)

给我一个想法......结果证明这是有效的:

@Path("/{subResources:.*}")
Run Code Online (Sandbox Code Playgroud)

注意最初的/.现在也许在三年内,这是他们已经修复或其他什么,但我希望这有助于某人,因为这个页面似乎是提到这种困境的唯一地方.


use*_*708 6

你可以尝试删除你的@PathParam注释,而是通过UriInfo获取路径:

@Context UriInfo uriInfo;

@GET
@Path("{subResources:.*}")
public String get() 
{
    String path = uriInfo.getPath();
}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么,但它适用于我的应用程序.


P. *_*ers 0

您是否会反对接受单个 PathParam(代表由某个标记分隔的子资源集合)?

例如 ...

@Path("/资源)
公共类我的资源{

   @得到
   @Path("{子资源}")
   公共字符串 get(@PathParam("subResources") String subResources)
   {
      String[] params = StringUtils.split(subResources, ";");
   }
}

..应该处理

获取:.../resources/firstSubResource
&
GET: .../resources/firstSubResource;seccondSubResource;thirdSubResource