Подтвердить что ты не робот

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

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

Копаться в этом просто:

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

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

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

GET:.../resources/firstSubResource

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

GET:.../resources/firstSubResource/seccondSubResource/thirdSubResource


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

Привет

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Дала мне идею... получается, что это работает:

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

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

Ответ 3

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

@Context UriInfo uriInfo;

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

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

Ответ 4

Не согласны ли вы принять один PathParam, представляющий коллекцию subResources, ограниченную некоторым токеном?

Например...

@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