我试图在我的客户端使用JAX RS的CXF实现补丁方法。首先,我将补丁注释定义为
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
public @interface PATCH {
}
参考这里的内容:如何为JAX-RS提供@PATCH注释?
然后我发现@PATCH被添加到CXF 3.1.2中,所以我在我的专家的pom中更改了版本.xml并且确实在软件包组织.apache.cxf.jaxrs.ext
内部有公开@interface补丁
,代码实际上看起来与我上面发布的内容完全相同。
但是,当我尝试在我的服务定义上使用此注释时
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public interface AbcService {
@PATCH
@Path("/abc/efg")
public SomeDTO patchSomething(RequestObject request);
}
正如我在上面发布的queston链接中所说的,我以< code > Java . net . protocol exception:Invalid HTTP method:PATCH 结束。他们与Jersey讨论了一些解决方案,但是我可以在CXF中做些什么,以便我可以使用:
AbcService abcService = JAXRSClientFactory.create(myURI, AbcService.class, myProviders, true);
abcService.patchSomething(new RequestObject('something'));
所以我有几个问题:
您可以尝试在代码中使用@PATCH
替换为@POST
以查看它是否有效吗?您的AbcService
接口在类型级别遗漏了@Path
注释(除非它是子资源?),因此可能值得先尝试使用标准HTTP动词以确保其他所有内容都正确配置。
事实证明这是因为在JAVA7中,HttpURLConnection不支持PATCH,该类中支持的方法静态定义为
private static final String[] methods = {
"GET", "POST", "HEAD", "OPTIONS", "PUT", "DELETE", "TRACE"
};
然而,可以在CXF中发送补丁请求,但是管道对象必须是< code>AsyncHTTPConduit类型。要让CXF使用AsyncHTTPConduit,您可以像这样通过编程实现它
AbcService service = JAXRSClientFactory.create(myURI, AbcService.class, myProviders, true);
WebClient.getConfig(service).getRequestContext().put("use.async.http.conduit", true);
service.patchEnvironmentParameters(patchRequest);
或者
WebClient client = WebClient.create("http://localhost:53261/v1-0/api/environment/parameters");
WebClient.getConfig(client).getRequestContext().put("use.async.http.conduit", true);
client.invoke("PATCH", "{}");
但是要小心!!为了使其工作,您已经将此依赖项放入项目中
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-hc</artifactId>
<version>${cxf.version}</version>
</dependency>
还要确保使用相同版本的cxf-rt-transports-超文本传输协议-hc
和cxf
。
但是正如你所看到的,我所描述的并没有解决最初的问题,这样,我只是提出了一个特定的补丁请求。然而,在我的项目中,有许多补丁服务是使用我最初展示的html" target="_blank">接口定义的
public interface AbcService {
@PATCH
@Path("/abc/efg")
public SomeDTO patchSomething(RequestObject request);
}
因此,为了仅在 PATCH 方法上使用 AsyncHTTPConduit,我必须编写自定义 CXF 拦截器,您可以在此处了解更多信息 http://cxf.apache.org/docs/interceptors.html 我编写的拦截器PRE_LOGIC阶段运行,它会检查使用哪种方法,如果是 PATCH,则定义了管道属性。然后在服务调用的后期阶段,CXF 使用此属性来选择应使用哪个 Conduit 实现,因此
if ( message.get(Message.HTTP_REQUEST_METHOD).equals("PATCH") {
message.put("use.async.http.conduit", true);
}
AsyncHTTPConduit
实例将用于PATCH的工作。
我试图使用CXF(3 . 1 . 3版)客户端调用带有补丁方法的API。 尝试按照以下线程中指定的步骤进行操作,但无法解决。只获取URLConnectionHttpConduit而不是AsyncHttpConduit http://cxf . Apache . org/docs/asynchronous-client-http-transport . html 如何在CXF中使用补丁方法 验证CX
我不知道PATCH和PUT方法之间的确切区别。有人能告诉我什么时候我们应该用适当的例子来使用这个方法吗?
我正在尝试创建一个CXF肥皂Web服务客户端,以便使用经过Kerberos身份验证的SharePoint实例进行肥皂调用。 我导入以下内容: 组织。阿帕奇。cxf:cxf rt前端jaxws:3.2.6 组织。阿帕奇。cxf:cxf rt传输http:3.2.6 组织。阿帕奇。cxf:cxf rt传输http hc:3.2.6 组织。阿帕奇。cxf:cxf rt ws-security:3.2.6
问题内容: 首先,一些定义: PUT在9.6节RFC 2616中 定义: PUT方法请求将封闭的实体存储在提供的Request-URI下。如果Request-URI引用了已经存在的资源, 则应 将封闭的实体 视为原始服务器上的 资源 的修改版本 。如果Request- URI没有指向现有资源,并且请求用户代理能够将该URI定义为新资源,则原始服务器可以使用该URI创建资源。 PATCH在RFC 5
问题内容: JAX- RS具有用于HTTP动词的注释,例如()和(),但是没有注释。如何为HTTP动词添加注释? 类似于以下内容: 问题答案: 我在这里得到答复。 只需定义一个自定义的Patch批注,这意味着您将必须使用以下代码编写一个 PATCH.java 文件: 导入 包含PATCH.java 的 包 ,然后可以像其他HTTP方法注释一样使用它: 我使用此@PATCH将一些JSON发送到我的R
是否可以覆盖嵌入的 CXF JaxRS 容器的 TomEE 中的设置?我一直在尝试集成我自己的拦截器来处理JaxRS服务的路由。 我似乎不能做的是让TomEE在启动我的服务时加载拦截器。 我读过很多文章,其中说我应该能够通过添加以下内容来配置TomEE中的CXF内容 我还看到了一些引用,说明TomEE使用了TomEE。xml替换openejbjar。xml,所以我尝试在那里进行pojo部署,但由于