如何为JAX-RS使用@PATCH批注?


70

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

类似于以下内容:

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

1
JAX-RS 2.1支持@PATCH开箱即用。
cassiomolin

Answers:


72

我在这里得到答复。

只需定义一个自定义的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
我使用此@PATCH将一些JSON发送到我的REST服务,它的工作就像一个魅力。您无法使用GET请求执行此操作,因此毫无疑问它将默认为GET请求。
VishalDevgire

@LutzHorn到目前为止,我一直在使用此@PATCH“ alongside” @GET@Path并且没有任何问题,使用Jersey 1.17.1
Lambart 2014年

1
我对此解决方案有疑问。Jersey将带注释的方法@PATCH视为资源定位器方法。我可能错过了什么?
Patryk Dobrowolski 2015年

如何仍未集成PATCH支持javax.ws.rs?我的意思是
乔恩

7
JAX-RS 2.1支持@PATCH开箱即用:)
cassiomolin

23

使用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 { }

@HttpMethod注释用于一个HTTP方法的名称与注释相关联,建立一个什么JAX-RS规范要求资源的方法指示符

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


5

在Jersey中,这可以很好地工作,但是在使用Jersey Client测试资源类时,会出现异常:

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客户端,您只需要在可扩展的测试类中覆盖client config方法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


1

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”。


0

如果您使用的是CXF 3.1.2或更高版本(),则可以使用org.apache.cxf.jaxrs.ext.PATCH

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.