@ Путь и регулярное выражение (Джерси / ОТДЫХ) - PullRequest
22 голосов
/ 01 июня 2010

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

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

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

Привет

Ответы [ 4 ]

21 голосов
/ 08 октября 2010

Можете ли вы попробовать использовать регулярное выражение, как указано в Обзор JAX-RS 1.1

Фрагмент кода будет выглядеть, как показано ниже для вашего случая

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

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

Надеюсь, это поможет.

8 голосов
/ 27 апреля 2013

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

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

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

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

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

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

6 голосов
/ 16 марта 2011

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

@Context UriInfo uriInfo;

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

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

0 голосов
/ 22 июня 2010

Вы были бы против принятия единственного 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...