@Path и регулярное выражение (Джерси/REST)

Я использую Jersey в проекте REST, и мне нужно использовать регулярное выражение.

Копать об этом просто, как:

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

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

Но, делая так, метод получает запрос только, если я передаю 1 параметр, например:

ПОЛУЧИТЬ: .../ресурсы/firstSubResource

Если я использую более 1 параметра, метод не получает запрос, например:

ПОЛУЧИТЬ: .../ресурсы/firstSubResource/второйSubResource/третийSubResource


Я могу использовать регулярное выражение, только если в моем @Path содержится переменная или текстовое значение, например:

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

Or

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

Сегодня я мог бы работать с этим решением переменной, но это не подходит для моей точки зрения.


Мой веб.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, одним в классе, а другим в методе.
  • Любые советы приветствуются!

С Уважением


person rafa.ferreira    schedule 31.05.2010    source источник
comment
Не могли бы вы опубликовать дополнительную информацию, в том числе: теги ‹servlet› и ‹servlet-mapping› из web.xml, образцы URL-адресов, аннотацию @Path, соответствующую каждому образцу URL-адресов, и все значения параметров пути, полученные Джерси? (Отредактируйте свой вопрос, чтобы добавить эту информацию.)   -  person Daniel Trebbien    schedule 01.06.2010
comment
@Daniel - Спасибо за ваш ответ, я добавляю к вопросу дополнительную информацию. С Уважением!   -  person rafa.ferreira    schedule 01.06.2010


Ответы (4)



Я знаю, что это действительно старый вопрос, но я только что наткнулся на него, пытаясь найти решение для себя. Я пытаюсь принять имена файлов в стиле s3, например, /folder/whatever/blah/.../image.jpg, которые могут быть любой мыслимой длины и содержать много /.

В любом случае ваше собственное решение:

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

Дал мне идею... оказывается, это работает:

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

обратите внимание на начальную /. Теперь, может быть, через три года они что-то исправили или что-то в этом роде, но я надеюсь, что это поможет кому-то, поскольку эта страница, кажется, единственное место, где упоминается это затруднительное положение.

person paullth    schedule 27.04.2013

Можете ли вы попробовать удалить аннотацию @PathParam и вместо этого получить путь с помощью UriInfo:

@Context UriInfo uriInfo;

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

Я не знаю почему, но это работает в моем приложении.

person user306708    schedule 16.03.2011

Вы были бы против принятия одного 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
person P. Deters    schedule 22.06.2010