Как получить аннотацию @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
.