【问题标题】:@Path and regular expression (Jersey/REST)@Path 和正则表达式 (Jersey/REST)
【发布时间】:2010-05-31 21:02:03
【问题描述】:

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

挖掘它很简单:

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

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

但是,这样做,如果我传递 1 个参数,该方法获取请求,例如:

GET: .../resources/firstSubResource

如果我使用超过 1 个参数,则方法获取请求,例如:

GET: .../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、一个在类中和另一个在方法中时。
  • 感谢任何提示!

问候

【问题讨论】:

  • 您能否发布更多信息,包括:web.xml 中的 标记、示例 URL、与每个示例 URL 匹配的 @Path 注释以及路径的所有值泽西收到的参数? (编辑您的问题以添加此信息。)
  • @Daniel - 感谢您的回答,我在问题中添加了更多信息。问候!

标签: java regex rest jersey


【解决方案1】:

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

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

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

给我一​​个想法...原来这行得通:

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

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

【讨论】:

    【解决方案2】:

    您能否尝试删除您的 @PathParam 注释并改为通过 UriInfo 获取路径:

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

    我不知道为什么,但它在我的应用程序中有效。

    【讨论】:

      【解决方案3】:

      你可以尝试使用Overview of JAX-RS 1.1中给出的正则表达式

      根据您的情况,代码 sn-p 如下所示

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

      希望对您有所帮助。

      【讨论】:

      • 如果要匹配“resources/”之后的任何字符,请使用模式.+,例如@Path("{subResources: .+}"),因为上面不会匹配带有空格或句点的url。例如“/resources/test/me.jpg”不匹配。
      • 还有一个小修改 - 如果你想确保 & 不包含在 subResources 部分中,请使用 [^&amp;?] 模式而不是 .+
      【解决方案4】:

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

      例如...

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

      .. 应该处理

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 2015-12-29
        • 1970-01-01
        • 1970-01-01
        • 2014-07-26
        • 2017-01-18
        相关资源
        最近更新 更多