24

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

挖掘它很简单,例如:

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

   @GET
   @Path("{subResources:.*}")
   public String get(@PathParam("subResources") String subResources) {...}
}

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

获取:.../resources/firstSubResource

如果我使用超过 1 个参数,则该方法不会收到请求,例如:

获取:.../resources/firstSubResource/seccondSubResource/thirdSubResource


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

@Path("{SubResource1}/{subResources:.*}")

或者

@Path("/hardCodeString/{subResources:.*}")

今天我可以使用这个变量的解决方案来运行,但从我的角度来看还不行。


我的 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>
(...)

问题

  • 有没有人做过相关的事情?
  • 我做错了什么?
  • 我认为这可能是一个错误,当使用多个@Path、一个在类中和另一个在方法中时。
  • 任何提示表示赞赏!

问候

4

4 回答 4

21

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

对于您的情况,代码片段如下所示

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

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

希望有帮助。

于 2010-10-08T08:52:36.283 回答
11

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

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

@Path("/hardCodeString/{subResources:.*}")

给我一个想法......原来这是可行的:

@Path("/{subResources:.*}")

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

于 2013-04-27T16:28:12.320 回答
7

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

@Context UriInfo uriInfo;

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

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

于 2011-03-16T09:57:36.900 回答
0

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

例如 ...

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

   @得到
   @Path("{subResources}")
   公共字符串获取(@PathParam(“subResources”)字符串子资源)
   {
      String[] 参数 = StringUtils.split(subResources, ";");
   }
}

..应该处理

获取:.../resources/firstSubResource
&
GET: .../resources/firstSubResource;seccondSubResource;thirdSubResource
于 2010-06-22T19:49:22.267 回答