福建巢网站建设,济南搜点网络科技有限公司,制作网站公司哪个好,法治网站的建设整改措施input发送a.jaxPATCH方法是最不受欢迎的HTTP方法之一#xff0c;因为直到最近才真正没有一种标准的PATCH格式。 一段时间以来#xff0c;它已经针对JSON进行了标准化#xff0c;因此有很多库可以为您完成繁重的工作。 出于本博客的目的#xff0c;我将使用json-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);}PATCHConsumes(application/json-patchjson)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 ListString list new ArrayListString();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 MultivaluedHashMapString, 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.ObjectsingletonList(application/json-patchjson)); }}}
} 参考来自Gerard Davison博客博客的JCG合作伙伴 Gerard Davison 对JAX-RS 2.0的透明PATCH支持 。 翻译自: https://www.javacodegeeks.com/2014/02/transparent-patch-support-in-jax-rs-2-0.htmlinput发送a.jax