当前位置: 首页 > 知识库问答 >
问题:

如何在CXF中使用PATCH方法

闻法
2023-03-14

我试图在我的客户端使用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'));

所以我有几个问题:

    < li >我如何才能做到这一点?不,我需要编写定制的CXF拦截器? < li >如果CXF不起作用,他们为什么要将补丁注释添加到CXF中? < li >另一个主题中的一些人说提到的补丁注释定义适用于他们。怎么会这样它只是在客户端制造麻烦吗?如果是,为什么会这样? < li >为什么我在CXF文档中找不到此注释?我查看了http://cxf.apache.org/javadoc/latest/的org.apache.cxf.jaxrs.ext包,没有看到任何补丁。然而在最新的cxf 3.1.2中,我真的可以在这个包中找到它。

共有2个答案

宗政德宇
2023-03-14

您可以尝试在代码中使用@PATCH替换为@POST以查看它是否有效吗?您的AbcService接口在类型级别遗漏了@Path注释(除非它是子资源?),因此可能值得先尝试使用标准HTTP动词以确保其他所有内容都正确配置。

澹台鸿光
2023-03-14

事实证明这是因为在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-超文本传输协议-hccxf

但是正如你所看到的,我所描述的并没有解决最初的问题,这样,我只是提出了一个特定的补丁请求。然而,在我的项目中,有许多补丁服务是使用我最初展示的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部署,但由于