Как иметь аннотацию @PATCH для JAX-RS?

JAX-RS имеет аннотации для HTTP-глаголов, таких как GET (@GET) и POST (@POST), но нет @PATCH Примечание. Как я могу иметь аннотацию для PATCH http-команду?

что-то вроде следующего:

@PATCH
public Response someCode() {
    // Code to handle the request
}

6 ответов


Я получил ответ здесь.

вам просто нужно будет определить пользовательскую аннотацию патча, это означает, что вам придется написать патч.java файл со следующим кодом:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
public @interface PATCH {
}

импорт на пакет, содержащий патч.java и затем вы можете использовать его, как и другие аннотации метода HTTP:

@PATCH
@Path("/data/{keyspace}")
@Produces({ "application/json" })
public void patchRow(@PathParam("keyspace") String keyspace, String body) 
throws Exception

я использовал этот @ PATCH для отправки JSON в мою службу REST.


используя JAX-RS 2.1?

JAX-RS 2.1 добавил @PATCH в список поддерживаемых HTTP-методов.

Использование Swagger?

при использовании чванство чтобы документировать REST API, вы можете использовать существующий @PATCH аннотация определена в .

используя Джерси и Dropwizard?

Dropwizard определяет @PATCH аннотация в io.dropwizard.jersey пакета.

напишите свой собственный

если вышеупомянутые подходы не работают для вас, вы можете написать свой собственный @PATCH аннотация:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
public @interface PATCH { }

на @HttpMethod аннотация используется для связывания имени метода HTTP с аннотацией, создавая то, что спецификация JAX-RS вызывает обозначение метода ресурса.

свой @PATCH аннотации работа штраф в размере в развязность.


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

java.net.ProtocolException: Invalid HTTP method: PATCH

существует обходной путь для этого, установив клиентское свойство

HttpUrlConnectorProvider.SET_METHOD_WORKAROUND 

но подождите, тогда вы получите следующее исключение:

javax.ws.rs.ProcessingException: java.net.ProtocolException: HTTP method PATCH doesn't support output

таким образом, нет другого способа, кроме изменения в клиентскую библиотеку Apache HTTP, используя Джерси версии 2.10, его легко настроить для использования Apache HTTP client, вам нужно только переопределите метод конфигурации клиента в тестовом классе, который расширяет JerseyTest.

@Override
protected void configureClient(ClientConfig config) {
  config.register(CustomJacksonJsonProvider.class);
  ConnectorProvider connectorProvider = new ApacheConnectorProvider();
  config.connectorProvider(connectorProvider);
}

и Вам также нужно добавить еще одну зависимость Maven,jersey-apache-connector и jersey-test-framework-provider-external см. Джерси док


Если вы используете dropwizard, содержит io.dropwizard.jersey.PATCH. Это именно то, что вам нужно.


JAX-RS API 2.0.1 не имеет патча. Но, глядя на JAX-RS API 2.2-SNAPSHOT code, патч теперь включен. Код:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod(HttpMethod.PATCH)
@Documented
public @interface PATCH {
}

здесь ссылке.

вы можете использовать те же коды для исправления, пока не выйдет 2.2. Для HttpMethod.Патч, просто замени его на "патч".


Если вы используете CXF 3.1.2 или более поздней версии (источник), вы можете использовать org.apache.cxf.jaxrs.ext.PATCH.