如何为JAX-RS提供@PATCH注释?

Vis*_*ire 66 java jax-rs

JAX-RS具有HTTP动词的注释,例如GET(@GET)和POST(@POST),但没有@PATCH注释.如何为PATCHHTTP动词添加注释?

类似于以下内容:

@PATCH
public Response someCode() {
    // Code to handle the request
}
Run Code Online (Sandbox Code Playgroud)

Vis*_*ire 66

我在这里得到了答案.

只需要定义一个自定义Patch注释,这意味着您将必须使用以下代码编写PATCH.java文件:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
public @interface PATCH {
}
Run Code Online (Sandbox Code Playgroud)

导入包含PATCH.java,然后您可以像使用其他HTTP方法注释一样使用它:

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

我使用这个@PATCH将一些JSON发送到我的REST服务.

  • JAX-RS 2.1支持`@ PATCH`开箱即用:) (7认同)
  • 我使用这个@PATCH将一些JSON发送到我的REST服务,它就像一个魅力.您无法使用GET请求执行此操作,因此毫无疑问它会默认为GET请求. (2认同)

cas*_*lin 19

使用JAX-RS 2.1?

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

使用Swagger?

使用Swagger记录REST API时,可以使用包中@PATCH定义的现有注释io.swagger.jaxrs.

使用Jersey和Dropwizard?

Dropwizard@PATCHio.dropwizard.jersey包中定义了一个注释.

写你自己的

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

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
public @interface PATCH { }
Run Code Online (Sandbox Code Playgroud)

@HttpMethod注释用于一个HTTP方法的名称与注释相关联,创建了JAX-RS规范要求什么资源的方法标志.

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


小智 5

在 Jersey 中,这可以正常工作,但是当使用 Jersey 客户端测试您的资源类时,您将收到异常:

java.net.ProtocolException: Invalid HTTP method: PATCH
Run Code Online (Sandbox Code Playgroud)

有一个解决方法,通过设置客户端属性

HttpUrlConnectorProvider.SET_METHOD_WORKAROUND 
Run Code Online (Sandbox Code Playgroud)

但是等等,那么你最终会遇到以下异常:

javax.ws.rs.ProcessingException: java.net.ProtocolException: HTTP method PATCH doesn't support output
Run Code Online (Sandbox Code Playgroud)

所以除了改用 Apache HTTP 客户端库之外别无他法,使用 Jersey 2.10 版,很容易配置使用 Apache HTTP 客户端,您只需要在扩展JerseyTest.

java.net.ProtocolException: Invalid HTTP method: PATCH
Run Code Online (Sandbox Code Playgroud)

并且您还需要添加另一个 Maven 依赖项,jersey-apache-connector并且jersey-test-framework-provider-external,请参阅Jersey 文档