Как получить аннотацию @PATCH для JAX-RS?

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

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

Использование JAX-RS 2.1?

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

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

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

Использование Джерси и Dropwizard?

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

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

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

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

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

Ваша собственная аннотация @PATCH должна работать отлично в Swagger.

Ответ 3

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

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, ее легко настроить для использования HTTP-клиента Apache, вам нужно только переопределить метод конфигурации клиента в вашем тестовом классе, который расширяет 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, см. Jersey doc

Ответ 4

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

Ответ 5

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

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

Вот ссылка .

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

Ответ 6

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