input发送a.jax_JAX-RS 2.0中的透明PATCH支持

input发送a.jax

PATCH方法是最不受欢迎的HTTP方法之一,因为直到最近才真正没有一种标准的PATCH格式。 一段时间以来,它已经针对JSON进行了标准化,因此有很多库可以为您完成繁重的工作。 出于本博客的目的,我将使用json-patch,尽管可以很容易地将此​​特定实现适应您选择的补丁库。

每个法线可以让资源和Bean类不受干扰。 在此示例代码中,我们有一个简单的资源,它知道如何返回原始对象,并且该资源允许您执行PATCH方法。 请注意,patch方法仅接受bean对象,这是因为我们需要做一些魔术才能预处理补丁。

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;@Path("service")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class Service {@GETpublic Bean get() {return new Bean(true);}@PATCH@Consumes("application/json-patch+json")public Bean patch(Bean input) {System.out.println(input.getMessage() + "  " + input.getTitle());return input;}}import java.util.ArrayList;
import java.util.List;public class Bean {private String title = "title";private String message = "message";private List<String> list = new ArrayList<String>();public Bean() {this(false);}public Bean(boolean init) {if (init) {title = "title";message = "message";list.add("one");list.add("two");}}public void setList(List list) {this.list = list;}public List getList() {return list;}public void setTitle(String title) {this.title = title;}public String getTitle() {return title;}public void setMessage(String message) {this.message = message;}public String getMessage() {return message;}}

因此,对于这个示例,我们必须创建@PATCH注释,幸运的是,JAX-RS为此目的包含了一个扩展元注释。 我们还将使用@NameBinding因为此示例使用的是JAX-RS 2.0,因此我们可以@NameBinding连接过滤器。

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;import javax.ws.rs.HttpMethod;
import javax.ws.rs.NameBinding;@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
@Documented
@NameBinding
public @interface PATCH {
}

因此,这里是ReaderInterceptor的实现,该实现将处理传入的流并将其替换为修补版本。 请注意,还使用@PATCH对该类进行了注释,以使@NamedBinding魔术起作用,并且还缺少许多错误处理,因为这是一个简单的POC。

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;import com.github.fge.jsonpatch.JsonPatch;
import com.github.fge.jsonpatch.JsonPatchException;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;import java.lang.annotation.Annotation;
import java.lang.reflect.Method;import javax.ws.rs.GET;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.ReaderInterceptor;
import javax.ws.rs.ext.ReaderInterceptorContext;import org.glassfish.jersey.message.MessageBodyWorkers;@Provider
@PATCH
public class PatchReader implements ReaderInterceptor {private UriInfo info;private MessageBodyWorkers workers;@Contextpublic void setInfo(UriInfo info) {this.info = info;}@Contextpublic void setWorkers(MessageBodyWorkers workers) {this.workers = workers;}@Overridepublic Object aroundReadFrom(ReaderInterceptorContext readerInterceptorContext) throws IOException,WebApplicationException {// Get the resource we are being called on, // and find the GET methodObject resource = info.getMatchedResources().get(0);Method found = null;for (Method next : resource.getClass().getMethods()) {if (next.getAnnotation(GET.class) != null) {found = next;break;}}if (found != null) {// Invoke the get method to get the state we are trying to patch//Object bean;try {bean = found.invoke(resource);} catch (Exception e) {throw new WebApplicationException(e);}// Convert this object to a an aray of bytes ByteArrayOutputStream baos = new ByteArrayOutputStream();MessageBodyWriter<? super Object> bodyWriter =workers.getMessageBodyWriter(Object.class, bean.getClass(), new Annotation[0], MediaType.APPLICATION_JSON_TYPE);bodyWriter.writeTo(bean, bean.getClass(), bean.getClass(), new Annotation[0], MediaType.APPLICATION_JSON_TYPE,new MultivaluedHashMap<String, Object>(), baos);// Use the Jackson 2.x classes to convert both the incoming patch  // and the current state of the object into a JsonNode / JsonPatchObjectMapper mapper = new ObjectMapper();JsonNode serverState = mapper.readValue(baos.toByteArray(), JsonNode.class);JsonNode patchAsNode = mapper.readValue(readerInterceptorContext.getInputStream(), JsonNode.class);JsonPatch patch = JsonPatch.fromJson(patchAsNode);try {// Apply the patchJsonNode result = patch.apply(serverState);// Stream the result & modify the stream on the readerInterceptorByteArrayOutputStream resultAsByteArray = new ByteArrayOutputStream();mapper.writeValue(resultAsByteArray, result);readerInterceptorContext.setInputStream(new ByteArrayInputStream(resultAsByteArray.toByteArray()));// Pass control back to the Jersey codereturn readerInterceptorContext.proceed();} catch (JsonPatchException e) {throw new WebApplicationException(Response.status(500).type("text/plain").entity(e.getMessage()).build());}} else {throw new IllegalArgumentException("No matching GET method on resource");}}
}

因此,一旦部署了此功能,就可以开始处理数据,因此原始消息是:

{"list" : ["one","two"],"message" : "message","title" : "title"
}

因此,如果应用以下修补程序,则返回的结果是:

[{"op" : "replace","path" : "/message","value" : "otherMessage"},{"op" : "add","path" : "/list/-","value" : "three"}
]{"list" : ["one","two","three"],"message" : "otherMessage","title" : "title"
}

此示例说明,遵循简单的编码模式并使用简单的注释,将PATCH支持添加到您的类中相对比较简单。 这样,由于实现可以仅委托给您现有的PUT方法,因此PATCH支持变得微不足道。

更新: Jersey团队的Mirsolav Fuksa提醒我,为了使此实现符合PATCH RFC,它应在客户端执行OPTIONS请求时提供Accept-Patch标头。 您可以使用简单的CotnainerResponseFilter来做到这一点:

import java.io.IOException;import java.util.Collections;import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;@Provider
public class OptionsAcceptHeader implements ContainerResponseFilter {@Overridepublic void filter(ContainerRequestContext requestContext,ContainerResponseContext responseContext) throws IOException {if ("OPTIONS".equals(requestContext.getMethod())) {if (responseContext.getHeaderString("Accept-Patch")==null) {responseContext.getHeaders().put("Accept-Patch", Collections.<Object>singletonList("application/json-patch+json"));  }}}
}

参考:来自Gerard Davison博客博客的JCG合作伙伴 Gerard Davison 对JAX-RS 2.0的透明PATCH支持 。

翻译自: https://www.javacodegeeks.com/2014/02/transparent-patch-support-in-jax-rs-2-0.html

input发送a.jax

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 日志函数参数_将日志信息作为参数传递给函数

我使用的Python库使用logging模块。但是&#xff0c;我创建了自己的log函数&#xff0c;脚本在内部使用。在下面是我要使用的日志记录功能&#xff1a;def log(name, content, swtch : bool None, time None):time time or datetime.now(pytz.timezone(US/Pacific))if swtch…

【渝粤教育】电大中专就业指导作业 题库

1.&#xff08; &#xff09;给中职生就业带来的机遇和挑战 A.一带一路 B.发展标准化服务业 C.“十三五”规划 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;C 2.最受企业欢迎的人才应具备&#xff08; &#xff09;素质 A.道德品质、文化认同、敬业精神、团队意识、…

python回车和换行的区别_回车与换行的解释~!

Unix/Linux和Windows回车换行Linux/Unix下的回车符与windows下的不同&#xff0c;Linux/unix下的回车符是0d,而在windows下则是0d0a&#xff0c;据说这和电脑刚开始发展时的电传打印机的速度有关。在计算机还没有出现之前&#xff0c;有一种叫电传打字机(teletype model 33)的玩…

【渝粤教育】电大中专常见病药物治疗作业 题库

1.作为退热药&#xff0c;阿司匹林的劣势是&#xff08; &#xff09;。 A.口服吸收迅速而完全 B.婴幼儿发热用阿苯片 C.儿童用药可引起Reye综合征&#xff0c;尤其是病毒性感染引起的发热 D.作用于下丘脑体温调节中枢 E.解热镇痛作用较强 错误 正确答案&#xff1a;左边查询 学…

在Spring Boot启动时运行代码

Spring Boot会自动为我们执行很多配置&#xff0c;但是迟早您将不得不做一些自定义工作。 在本文中&#xff0c;您将学习如何进入应用程序引导生命周期并在Spring Boot启动时执行代码 。 因此&#xff0c;让我们看看该框架提供了什么。 1. Bean初始化时执行方法 Spring启动您…

错误:在keystone中无法找到默认角色user_第四章 keystone认证组件安装1

1、在控制节点安装rabbitmq、memcached组件apt-get -y install rabbitmq-server memcached python-pymysql # 设置openstack用户 rabbitmqctl add_user openstack password #后一个password是密码&#xff0c;需要特别注意&#xff0c;要与后面组件访问时的密码一致 #设置ope…

【渝粤教育】电大中专建设工程法规1作业 题库

1.注册建造师应当在相应的岗位上执业。但同时&#xff0c;国家鼓励和提倡注册建造师( )。 A.一师多岗 B.一师全岗 C.一师专岗 D.专岗专职 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.下列规范性文件中,效力最高的是( )。 A.地方性法规 B.行政法规 C.行政规章…

【渝粤教育】电大中专新媒体营销实务 (13)作业 题库

1.新媒体在进行内容传播时&#xff0c;可以做到将文字、图片、视频等同时传播&#xff0c;呈现出&#xff08; &#xff09;的特点。 A.移动化 B.多元化 C.便捷性 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.第四媒体发展到宽带互联网阶段成为&#xff08; &a…

ubuntu加了张固态_将ubuntu系统迁移到ssd固态

朋友送了一个固态硬盘给我&#xff0c;因此将原机械硬盘上的系统迁移到固态硬盘上。原机械硬盘(dev/sdb)装有win10和ubuntu双系统。分区情况如下&#xff1a;sda1&#xff1a;ESP分区sda2&#xff1a;资料sda3&#xff1a;资料sda4&#xff1a;swap分区&#xff0c;被我干掉了&…

【渝粤教育】电大中专测量学 (3)作业 题库

试卷答案 1水准面是水体受地球重力的作用而形成的&#xff0c;其物理特点是在同一水准面上的任意一点具有相等的重力势位&#xff0c;上面任意一点的铅垂线都垂直于该点所在曲面的切平面。 A正确 B错误 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2在地球表面&a…

php cdi_教程:编写自己的CDI扩展

php cdi今天&#xff0c;我将向您展示如何编写CDI扩展。 CDI提供了一种扩展功能的简便方法&#xff0c;例如 添加自己的范围&#xff0c; 启用Java核心类进行扩展&#xff0c; 使用注释元数据进行扩充或修改&#xff0c; 以及更多。 在本教程中&#xff0c;我们将实现一个…

【渝粤教育】广东开放大学 海外社交媒体营销 形成性考核 (45)

选择题 题目&#xff1a;经营战略计划的制定和实施&#xff0c;要以特定的()为依据。 答案&#xff1a;看左侧 题目&#xff1a;战略经营单位是企业值得为其专门制定一种经营战略的()经营单位。 答案&#xff1a;看左侧 题目&#xff1a;从20世纪初到第二次世界大战结束&#x…

centos编译mysql5.6_centos7上编译安装mysql5.6

注意&#xff0c;在做实验室统一关闭防火墙做的&#xff0c;在生产环境需要做防火墙规则的&#xff0c;大家要注意&#xff0c;做的时候尽量都是模仿生产环境的&#xff0c;比如服务一般都在/data/soft下面&#xff0c;尽量避免在/usr/local/下面。安装编译mysql所需要的软件[r…

【渝粤教育】广东开放大学 社会工作综合能力 形成性考核 (27)

选择题 题目&#xff1a;社会工作不同于其他理论性社会科学学科的重要之点是&#xff08; &#xff09;。 题目&#xff1a;关于社会工作价值观操作原则的说法&#xff0c;正确的有( )。 题目&#xff1a;作为一名专业社会工作者&#xff0c;必须遵守的原则不包括&#xff08; …

使用ELK堆栈进行日志聚合

1.简介 随着微服务的使用&#xff0c;创建稳定的分布式应用程序和摆脱许多遗留问题变得很容易。 但是微服务的使用也带来了一些挑战&#xff0c; 分布式日志管理就是其中之一。 由于微服务是隔离的&#xff0c;因此它们不共享数据库和日志文件&#xff0c;因此实时搜索&#xf…

【渝粤教育】广东开放大学 网络整合营销 形成性考核 (53)

选择题 题目&#xff1a; 网络营销应在&#xff08; &#xff09;层面做好格局方面的准备 答案&#xff1a;看左侧 题目&#xff1a; 在互联网社交时代&#xff0c;下列哪个不是其时代特征的产物。&#xff08; &#xff09; 答案&#xff1a;看左侧 题目&#xff1a; 移动端发…

mysql主从延时这么长_MySQL主从延迟问题解决

今天我们就来看看为什么会产生主从延迟以及主从延迟如何处理等相关问题。坐好了&#xff0c;准备发车&#xff01;主从常见架构随着日益增长的访问量&#xff0c;单台数据库的应接能力已经捉襟见肘。因此采用主库写数据&#xff0c;从库读数据这种将读写分离开的主从架构便随之…

【渝粤教育】广东开放大学 跨文化商务沟通 形成性考核 (42)

选择题 题目&#xff1a; The “OK” sign means in France that you think something is _________. 答案&#xff1a;看左侧 题目&#xff1a; Many words from Chinese and English are different in both the denotational meanings and connotational meanings. Which o…

python的zip方法_python zip()函数使用方法解析

这篇文章主要介绍了python zip()函数使用方法解析,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下参数iterable为可迭代的对象&#xff0c;并且可以有多个参数。该函数返回一个以元组为元素的列表&#xff0c;其…

aes256加密java_使用Java和JCEKS进行AES-256加密

aes256加密java总览 由于最近爱德华斯诺登 &#xff08; Edward Snowden&#xff09;发布了文件&#xff0c;以及针对JC Penny &#xff0c; Sony和Target等在线商业商店的黑客攻击激增&#xff0c;安全性已成为近年来讨论的重要话题。 尽管本文不会为您提供帮助防止使用非法来…