Поддерживает ли Джерси знак доллара в аннотации Path JAX-RS? - PullRequest
5 голосов
/ 09 января 2012

Я хотел бы получить доступ к следующим URL-адресам для отдыха:

Первый URL работаетхорошо.У меня проблемы с URL-адресом $ count, использующим реализацию JAX-RS на Джерси.

Вот код ресурса.

@Path("/helloworld")
public class HelloWorldResource {
    @GET
    @Produces("text/plain")
    public String getClichedMessage() {
        return "Hello World!";
    }

    @GET
    @Path("\\$count")
    @Produces("text/plain")
    public String getClichedMessage(
            @PathParam("\\$count") String count) {

        return "Hello count";
    }
}

Я также пробовал использовать "$ count" ви @Path, и @PathParam, но это тоже не сработало.

Примечание. Если я удаляю знак доллара из всего приведенного выше кода, он отлично работает для URL localhost: 9998 / helloworld / count.Однако мне нужно, чтобы в URL был знак доллара, потому что это будет приложение производителя OData.

Ответы [ 4 ]

3 голосов
/ 10 января 2012

Нашел ответ.Размещение знака доллара в классе символов сделало свое дело.

@GET
@Path("{count : [$]count(/)?}")
@Produces("text/plain")
public String getClichedMessageCount(
        @PathParam("count") String count) {

    return "Hello count";
}

Вышеприведенные совпадения соответствуют следующим URL-адресам.

  • localhost: 9998 / helloworld / $ count
  • localhost: 9998 / helloworld / $ count /
  • localhost: 9998 / helloworld / $ count? $ filter = blah
  • localhost: 9998 / helloworld / $ count /? $ filter = blah
1 голос
/ 09 января 2012

Знаки доллара - это специальные символы в URL-адресах, и, боюсь, их нужно кодировать как таковые:

http://www.blooberry.com/indexdot/html/topics/urlencoding.htm

Персонаж, которого вы ищете, это% 24, если вам интересно, хотя, если вы находитесь в Java, чтение класса java.net.URI может стоить того. Я не играл с Джерси, но Java более чем способна сделать тяжелую работу за вас здесь.

0 голосов
/ 25 сентября 2018

Вопрос давно решен, но, возможно, это поможет кому-то в будущем искать подобную проблему.

Мы нашли способ решения этой проблемы - написать класс, который заменяет закодированный знак обратно насам знак доллара.Мы зарегистрировали класс в нашем RestEasyClient.

public class LoggingFilter implements ClientRequestFilter{

@Override
public void filter(ClientRequestContext context) throws IOException {
   //replace uri in context...
   String uri = context.getUri();
   //regex to replace $ sign in uri
   //set new uri in context so request goes to correct url
   context.setUri(uri);
}
0 голосов
/ 10 января 2012

Вы используете неправильный слеш в @ Path

@GET
@Path("/$count")
@Produces("text/plain")
public String getClichedMessage(
        @PathParam("\\$count") String count) {

    return "Hello count";
}

Кроме того, это неправильный способ использования PathParam. Если вы пытаетесь получить значение после / helloworld, вы должны сделать следующее

@GET
@Path("/{$count}")
@Produces("text/plain")
public String getClichedMessage(
        @PathParam("$count") String count) {

    return "Hello count";
}

Редактировать Не удалось заставить его работать с $

@Path("count") // works
@Path("/count") // works
@Path("\\count") // does not work
@Path("$count") // does not work
@Path("/$count") // does not work
...