当前位置: 首页 > news >正文

java的人patch方法_java – 如何在CXF中使用PATCH方法

我正在尝试在我的客户端使用PATCH方法使用JAX-RS的CXF实现.

起初我将PATCH注释定义为

@Target({ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

@HttpMethod("PATCH")

public @interface PATCH {

}

然后我发现@PATCH被添加到CXF 3.1.2中,所以我在我的maven的pom.xml中更改了版本,并且确实在包org.apache.cxf.jaxrs.ext中有公共@interface PATCH;并且代码实际上看起来与我上面发布的完全相同.

但是,当我尝试在我的服务定义上使用此注释时

@Consumes(MediaType.APPLICATION_JSON)

@Produces(MediaType.APPLICATION_JSON)

public interface AbcService {

@PATCH

@Path("/abc/efg")

public SomeDTO patchSomething(RequestObject request);

}

我最终得到了java.net.ProtocolException:无效的HTTP方法:PATCH,就像我在上面发布的queston链接中所说的那样.他们用Jersey讨论了一些解决方案,但是我可以在CXF中做什么,以便我可以使用:

AbcService abcService = JAXRSClientFactory.create(myURI, AbcService.class, myProviders, true);

abcService.patchSomething(new RequestObject('something'));

所以我有几个问题:

>我怎样才能做到这一点?不,我需要编写自定义CXF拦截器?

>为什么如果它不起作用,他们会将PATCH注释添加到CXF中?

>另一个话题中的一些人说,提到的PATCH注释定义适用于他们.怎么会 ?它只会在客户端造成麻烦,如果是这样,为什么呢?

>为什么我在CXF文档中找不到这个注释?我在http://cxf.apache.org/javadoc/latest/查看了org.apache.cxf.jaxrs.ext包,但是我没有看到任何PATCH.然而在最新的cxf 3.1.2中我真的可以在这个包中找到它.

解决方法:

事实证明这是因为在JAVA7中,HttpURLConnection不支持PATCH,该类中支持的方法被静态定义为

private static final String[] methods = {

"GET", "POST", "HEAD", "OPTIONS", "PUT", "DELETE", "TRACE"

};

但是,可以在CXF中发送PATCH请求,但Conduit对象必须是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", "{}");

但要小心!!为了使这项工作成功,您已将此依赖项放入项目中

org.apache.cxf

cxf-rt-transports-http-hc

${cxf.version}

还要确保使用相同版本的cxf-rt-transports-http-hc和cxf.

但是你可以看到我所描述的并没有解决原始问题,这样我只做了1个特定的PATCH请求.但是在我的项目中,有许多PATCH服务使用我最初显示的接口定义

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,它定义了conduit属性.然后在服务调用的后期阶段,CXF使用此属性来选择应该使用哪个Conduit实现,之后

if ( message.get(Message.HTTP_REQUEST_METHOD).equals("PATCH") {

message.put("use.async.http.conduit", true);

}

将使用AsyncHTTPConduit实例与PATCH一起工作.

标签:java,rest,jax-rs,cxf,http-patch

来源: https://codeday.me/bug/20190528/1169416.html

相关文章:

  • java func_Java通过匿名类来实现回调函数实例总结
  • Java关系表达式x y_Java正则逻辑运算符[X|Y]匹配
  • java将五元换成1元5角_C,一个代码来获得一笔钱转换成四分之一,硬币,镍币,便士[关闭]...
  • java 对方 GBK 乱码_【转】Java编码与乱码---GBK与UTF-8之间的转换
  • mySQL表变量和临时表的区别_SQL Server表变量和临时表的区别
  • 将java类的包注册到map中_java hashmap对象当实参是出现”java:11: 错误: 无法将类 Role中的构造器 Role应用到给定类型;”?...
  • JAVA不是主方法怎么输出_java主方法如何调用非静态方法
  • php显示缩小的图片代码,php等比例缩放图片及剪切图片代码分享
  • php代码转换工具,推荐几款格式化工具以及代码转换工具
  • img标签 中的php图片大小,html中关于img标签以及改变图片尺寸的详解(图)
  • php csv 源码 下载,[PHP] 使用php生成下载csv文件
  • java 去掉 u00a0,UTF-8编码中的特殊空格之C2 A0 - NO-BREAK SPACE
  • java里函数式表达式,Java8 Lambda表达式 和 函数式编程 原理详解
  • 易语言与php加密AES,易语言调用openssl库实现aes cbc/cfb 256加密
  • linux安装php json拓展,Linux PHP增加JSON支持
  • 【Leetcode】101. 对称二叉树
  • JS 中的深拷贝与浅拷贝
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • canvas 五子棋游戏
  • github从入门到放弃(1)
  • Hibernate【inverse和cascade属性】知识要点
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • nodejs调试方法
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • React-生命周期杂记
  • vue:响应原理
  • 初识 beanstalkd
  • 从tcpdump抓包看TCP/IP协议
  • 关于Flux,Vuex,Redux的思考
  • 诡异!React stopPropagation失灵
  • 好的网址,关于.net 4.0 ,vs 2010
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 听说你叫Java(二)–Servlet请求
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • zabbix3.2监控linux磁盘IO
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • $.ajax()
  • (层次遍历)104. 二叉树的最大深度
  • (第27天)Oracle 数据泵转换分区表
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (转)德国人的记事本
  • (状压dp)uva 10817 Headmaster's Headache
  • .bat批处理出现中文乱码的情况
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net MySql
  • .Net Web项目创建比较不错的参考文章
  • .NET 读取 JSON格式的数据
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET程序员迈向卓越的必由之路