2010-05-31 114 views
22

我在一家REST项目中使用新泽西,我需要使用正则表达式@Path和正则表达式(州/ REST)

挖它是简单的像:

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

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

但是,做这样的方法越来越请求只有当我经过1个PARAM,例如:

GET :.../resources/firstSubResource

如果使用多于1个参数的方法是不得到请求,例如:

GET:... /资源/ 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,一个在Class中,另一个在Method中。
  • 任何提示表示赞赏!

问候

+1

请您发布更多信息,包括:和web.xml中的标签,示例URL,匹配每个示例URL的@Path注释以及Jersey收到的所有路径参数值。 (编辑您的问题以添加此信息。) – 2010-06-01 10:45:51

+0

@Daniel - 感谢您的回答,我在问题中添加了更多信息。问候! – 2010-06-01 14:19:25

回答

1

你会反对接受单一PathParam,代表通过一些象征性的分隔子资源的集合?

例如...

@Path("/resources) 
public class MyResource { 

    @GET 
    @Path("{subResources}") 
    public String get(@PathParam("subResources") String subResources) 
    { 
     String[] params = StringUtils.split(subResources, ";"); 
    } 
}

..应处理

 
GET: .../resources/firstSubResource 
& 
GET: .../resources/firstSubResource;seccondSubResource;thirdSubResource 
20

你可以尝试使用正则表达式作为Overview of JAX-RS 1.1

代码片段给出看上去就像下面的情况

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

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

希望有所帮助。

+0

如果你想在“resources /”之后匹配任何字符,使用'。+',例如'@Path(“{subResources:。+}”)',因为上述内容不会与空格或句点匹配在里面。例如“/resources/test/me.jpg”不匹配。 – 2015-09-15 13:10:23

+0

和一个稍微修改 - 如果你想确保&不包含在'subResources'部分,使用'[^&?]'模式而不是'。+ – 2015-09-22 18:11:14

6

你可以尝试删除您@PathParam注释和而不是获取路径UriInfo

@Context UriInfo uriInfo; 

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

我不知道为什么,但它在我的应用程序工作。

8

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

反正自己的解决方案:

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

给了我一个想法......原来,这个工程:

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

通知初始/。现在也许在三年之内,这是他们固定的东西或其他什么,但我希望这可以帮助某人,因为这个网页似乎是唯一提到这种困境的地方。