JAX-RS具有HTTP动词的注释,例如GET
(@GET
)和POST
(@POST
),但没有@PATCH
注释。如何为PATCH
HTTP动词添加注释?
如下所示:
@PATCH
public Response someCode() {
// Code to handle the request
}
答案 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
。