java - servicios - ¿Cómo tener una anotación @PATCH para JAX-RS?
jaxrs java (6)
¿Usando JAX-RS 2.1?
JAX-RS 2.1 agregó @PATCH
a la lista de métodos HTTP admitidos.
¿Usando Swagger?
Al usar Swagger para documentar una API REST, puede usar la anotación @PATCH
existente definida en el paquete io.swagger.jaxrs
.
¿Usando Jersey y Dropwizard?
Dropwizard define una anotación @PATCH
en el paquete io.dropwizard.jersey
.
Escribe lo tuyo
Si los enfoques mencionados anteriormente no funcionan para usted, puede escribir su propia anotación @PATCH
:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
public @interface PATCH { }
La anotación @HttpMethod
se usa para asociar el nombre de un método HTTP con una anotación, creando un lo que la especificación JAX-RS llama designador de método de recursos .
Su propia anotación @PATCH
debería funcionar bien en Swagger.
JAX-RS tiene anotaciones para verbos HTTP como GET
( @GET
) y POST
( @POST
) pero no hay @PATCH
anotación @PATCH
. ¿Cómo puedo tener una anotación para el verbo PATCH
HTTP?
Algo como lo siguiente:
@PATCH
public Response someCode() {
// Code to handle the request
}
En Jersey esto funcionará bien, pero al usar Jersey Client para probar su clase de recursos, obtendrá excepciones:
java.net.ProtocolException: Invalid HTTP method: PATCH
Hay una solución para esto, al establecer la propiedad del cliente
HttpUrlConnectorProvider.SET_METHOD_WORKAROUND
Pero espera, entonces terminarás con la siguiente excepción:
javax.ws.rs.ProcessingException: java.net.ProtocolException: HTTP method PATCH doesn''t support output
Así que no hay otra manera que cambiar a la biblioteca del cliente Apache HTTP, utilizando la versión 2.10 de Jersey, es fácil de configurar para usar el cliente Apache HTTP, solo necesita reemplazar el método de configuración del cliente en su clase de prueba que extiende JerseyTest
.
@Override
protected void configureClient(ClientConfig config) {
config.register(CustomJacksonJsonProvider.class);
ConnectorProvider connectorProvider = new ApacheConnectorProvider();
config.connectorProvider(connectorProvider);
}
Y también necesita agregar otra dependencia de Maven, jersey-apache-connector
y jersey-test-framework-provider-external
, ver Jersey doc
JAX-RS API 2.0.1 no tiene PATCH. Pero, mirando el código JAX-RS API 2.2-SNAPSHOT, PATCH ahora está incluido. El código es:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod(HttpMethod.PATCH)
@Documented
public @interface PATCH {
}
Aquí está el link .
Puede usar los mismos códigos para el remedio hasta que 2.2 esté fuera. Para HttpMethod.PATCH, simplemente reemplázalo con "PATCH".
Si está utilizando dropwizard , contiene io.dropwizard.jersey.PATCH
. Es exactamente lo que necesitas.
Si está utilizando CXF 3.1.2 o posterior ( source ), puede usar org.apache.cxf.jaxrs.ext.PATCH
.
Tengo respuesta here .
Uno solo tendrá que definir una anotación de parche personalizada, lo que eso significa es que tendrá que escribir un archivo PATCH.java con el siguiente código:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
public @interface PATCH {
}
Importe el paquete que contiene PATCH.java y luego puede usarlo como otras anotaciones de método HTTP:
@PATCH
@Path("/data/{keyspace}")
@Produces({ "application/json" })
public void patchRow(@PathParam("keyspace") String keyspace, String body)
throws Exception
Utilicé este @PATCH para enviar algunos JSON a mi servicio REST.