如何获得JAX-RS的@PATCH注释?

JAX-RS具有HTTP动词的注释,如GET@POST )和POST@POST ),但不存在@PATCH注释。 我怎样才能有PATCH HTTP动词的注释?

像下面这样:

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

我在这里得到答案。

你只需要定义一个自定义的补丁注释,这意味着你将不得不写一个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服务。

使用JAX-RS 2.1?

JAX-RS 2.1将@PATCH添加到支持的HTTP方法列表中。

使用Swagger?

使用SwaggerloggingREST API时,可以使用io.swagger.jaxrs包中定义的现有@PATCH注释。

使用泽西和Dropwizard?

Dropwizard在io.dropwizard.jersey包中定义了@PATCH注释。

写你自己的

如果上述方法不适用于您,您可以编写自己的@PATCH注释:

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

@HttpMethod注释用于将HTTP方法的名称与注释相关联,从而创buildJAX-RS规范所称的资源方法指示符

您自己的@PATCH注释应该在Swagger中正常工作 。

在泽西岛这将工作得很好,但是当使用泽西客户端来testing你的资源类,你会得到例外:

 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 

所以没有别的办法比使用Jersey版本2.10更改为Apache HTTP客户端库,使用Apache HTTP客户端很容易configuration,您只需要覆盖扩展JerseyTesttesting类中的客户端configuration方法JerseyTest

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

而且还需要添加另一个Maven依赖项, jersey-apache-connectorjersey-test-framework-provider-external ,请参阅Jersey doc

如果你正在使用dropwizard ,它包含io.dropwizard.jersey.PATCH 。 这正是你需要的。

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,只需将其replace为“PATCH”即可。