Я использую jersey
с jackson
через maven
:
<jackson.version>2.9.6</jackson.version>
<jersey.version>2.25.1</jersey.version>
<jetty.version>9.2.11.v20150529</jetty.version>
....
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-base</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<!-- Jersey Server -->
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-jetty-http</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey.version}</version>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-base</artifactId>
</exclusion>
<exclusion>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
</exclusion>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</exclusion>
</exclusions>
</dependency>
У меня есть класс обслуживания со следующим методом + метод POST:
@GET
@Path("{Prefix}{p:/?}{id: ((\\d+)?)}/abc{p2:/?}{number: (([A-Za-z0-9]*)?)}")
@Produces(MediaType.APPLICATION_JSON)
public Response getMyToken(@Context ServletContext context, @Context Request request, @HeaderParam("If-None-Match") String ifMatch, @HeaderParam("Prefer") String prefer) {..}
@POST
@Path("{Prefix}{p:/?}{id: ((\\d+)?)}/abc/{myValueVariable}")
@Produces(MediaType.APPLICATION_JSON)
public Response setMyToken(@Context ServletContext context, @Context Request request, @HeaderParam("If-None-Match") String ifMatch, @HeaderParam("Prefer") String prefer) {..}
Этот GET
Url ДОЛЖЕН принимать два необязательных параметра. Например. следующие URL должны совпадать:
- P / 1 / abc / MyNumber
- P / а / MyNumber
- P / * 1 026 * 1 * 1 027 * / * аЬс +1028 *
Однако кажется, что первые два URL НЕ совпадают - второй необязательный параметр, похоже, не распознается (я получаю ошибку 405 - метод не вызывается). Я протестировал много вещей и понял, что добавление дополнительного параметра в конце приводит к совпадению моего URL. Так с последующим методом
@GET
@Path("{Prefix}{p:/?}{id: ((\\d+)?)}/abc{p2:/?}{number: (([A-Za-z0-9]*)?)}/endPath")
@Produces(MediaType.APPLICATION_JSON)
public Response getMyToken(@Context ServletContext context, @Context Request request, @HeaderParam("If-None-Match") String ifMatch, @HeaderParam("Prefer") String prefer) {..}
следующие URL-адреса совпадают:
Я не хочу иметь этот последний параметр. Как я могу решить эту проблему? Что я делаю не так?
EDIT:
Я также заметил, что это работает, если я не использую первый символ места:
@GET
@Path("hardCodePrefix{p:/?}{id: ((\\d+)?)}/abc{p2:/?}{number: (([A-Za-z0-9]*)?)}")
Как только я пытаюсь заменить hardCodePrefix на переменную или регулярное выражение, у меня возникает проблема, как описано выше (URL не совпадают)
EDIT2:
Странно то, что даже подстановочный знак . * не работает ...
@GET
@Path("hardCodePrefix{p:/?}{id: ((\\d+)?)}/abc{p2:/?}{number: .*}")
Так, например P / 1 / abc / совпадает, и я получаю /
для p2. Однако что-то вроде P / 1 / abc / 2 больше не работает .... (нет ошибки метода сопоставления)
EDIT3: Finding - Необязательный параметр метода GET не распознается, если существует метод POST
Теперь я сделал интересное наблюдение . Если я добавляю дополнительную услугу POST
к своему классу обслуживания, служба GET
НЕ работает (URL
P / abc / MyNumber не возвращает ошибку, найденную методом), если я удаляю, это работает ( вышеуказанные проблемы возникли из-за того, что я всегда использовал метод POST):
@GET
@Path("{Prefix}{p:/?}{id: ((\\d+)?)}/abc{p2:/?}{number: (([A-Za-z0-9]*)?)}")
public Response doAnything2() {
return Response.ok("sdf").build();
}
/*with that code below the GET method does not work, if I remove it, it works*/
@POST
@Path("{Prefix}{p:/?}{id: ((\\d+)?)}/abc/{yeah}")
public Response doAnything3() {
return Response.ok("sdf").build();
}
Существование POST
, по-видимому, мешает работе GET
метода: Это ошибка майки?
Я тестирую свой код, используя Postman
, и я явно устанавливаю метод GET
.
Как я могу решить эти проблемы?
РЕДАКТИРОВАТЬ4: Ограниченный ответ
С учетом следующего кода:
@POST
@Path("{Prefix2}{p4:/?}{id8: ((\\d+)?)}/abc/{yeah}")
public Response doAnything3() {
return Response.ok("sdf").build();
}
@GET
@Path("{Prefix}{p:/?}{id: ((\\d+)?)}/abc{p2:/?}{number: (([A-Za-z0-9]*)?)}")
public Response doAnything2() {
return Response.ok("sdf").build();
}
URL
mypath/1/abc/dd
, вызванный с GET
, возвращает ошибку метода не найдена.
Если I изменить , то метод с аннотацией POST на
/*adding the last to parameters as an optional parameters*/
@POST
@Path("{Prefix}{p:/?}{id: ((\\d+)?)}/abc{p8:/?}{number: (([A-Za-z0-9]*)?)}"
public Response doAnything3() {
return Response.ok("sdf").build();
}
@GET
@Path("{Prefix}{p:/?}{id: ((\\d+)?)}/abc{p2:/?}{number: (([A-Za-z0-9]*)?)}")
public Response doAnything2() {
return Response.ok("sdf").build();
}
решает проблему . Это грязный обходной путь (потому что последний параметр, использующий POST
, не должен быть необязательным (см. Верхнюю часть вопроса)). Я не знаю, почему происходят такие странные вещи -> ответ должен прояснить, почему это происходит, и в ответе должно быть представлено хорошее решение.