JAX-RS带有HTTP动词的注释,例如GET
(@GET
)和POST
(@POST
),但是没有@PATCH
注释。如何为PATCH
HTTP动词添加注释?
类似于以下内容:
@PATCH
public Response someCode() {
// Code to handle the request
}
Answers:
我在这里得到答复。
只需定义一个自定义的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服务。
@PATCH
“ alongside” @GET
,@Path
并且没有任何问题,使用Jersey 1.17.1
@PATCH
视为资源定位器方法。我可能错过了什么?
javax.ws.rs
?我的意思是
@PATCH
开箱即用:)
JAX-RS 2.1已添加@PATCH
到受支持的HTTP方法列表中。
使用Swagger记录REST API时,可以使用包中@PATCH
定义的现有注释io.swagger.jaxrs
。
Dropwizard@PATCH
在io.dropwizard.jersey
包中定义了注释。
如果上述方法对您不起作用,则可以编写自己的@PATCH
注释:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
public @interface PATCH { }
该@HttpMethod
注释用于一个HTTP方法的名称与注释相关联,建立一个什么JAX-RS规范要求资源的方法指示符。
您自己的@PATCH
注释在Swagger中应该可以正常工作。
在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
@PATCH
开箱即用。