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

时间:2013-07-27 11:18:22

标签: java jax-rs

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

如下所示:

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

5 个答案:

答案 0 :(得分:62)

我得到了答案here

只需定义自定义补丁注释,这意味着您必须使用以下代码编写 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服务。

答案 1 :(得分:4)

在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

除了改用Apache HTTP客户端库之外别无其他方法,使用Jersey版本2.10,它易于配置为使用Apache HTTP客户端,您只需要覆盖扩展{{}的测试类中的客户端配置方法。 1}}。

JerseyTest

您还需要添加另一个Maven依赖项@Override protected void configureClient(ClientConfig config) { config.register(CustomJacksonJsonProvider.class); ConnectorProvider connectorProvider = new ApacheConnectorProvider(); config.connectorProvider(connectorProvider); } jersey-apache-connector,请参阅Jersey doc

答案 2 :(得分: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 {
}

这是link

在2.2用完之前,您可以使用相同的代码进行补救。对于HttpMethod.PATCH,只需将其替换为" PATCH"。

答案 3 :(得分:0)

如果您使用的是dropwizard,则其中包含io.dropwizard.jersey.PATCH。这正是你所需要的。

答案 4 :(得分:0)

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