如何获得JAX-RS的@PATCH注释?
JAX-RS具有HTTP动词的注释,如GET
( @POST
)和POST
( @POST
),但不存在@PATCH
注释。 我怎样才能有PATCH
HTTP动词的注释?
像下面这样:
@PATCH public Response someCode() { // Code to handle the request }
我在这里得到答案。
你只需要定义一个自定义的补丁注释,这意味着你将不得不写一个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服务。
使用JAX-RS 2.1?
JAX-RS 2.1将@PATCH
添加到支持的HTTP方法列表中。
使用Swagger?
使用SwaggerloggingREST API时,可以使用io.swagger.jaxrs
包中定义的现有@PATCH
注释。
使用泽西和Dropwizard?
Dropwizard在io.dropwizard.jersey
包中定义了@PATCH
注释。
写你自己的
如果上述方法不适用于您,您可以编写自己的@PATCH
注释:
@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @HttpMethod("PATCH") public @interface PATCH { }
@HttpMethod
注释用于将HTTP方法的名称与注释相关联,从而创buildJAX-RS规范所称的资源方法指示符 。
您自己的@PATCH
注释应该在Swagger中正常工作 。
在泽西岛这将工作得很好,但是当使用泽西客户端来testing你的资源类,你会得到例外:
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客户端很容易configuration,您只需要覆盖扩展JerseyTest
testing类中的客户端configuration方法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
如果你正在使用dropwizard ,它包含io.dropwizard.jersey.PATCH
。 这正是你需要的。
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,只需将其replace为“PATCH”即可。