moxy json介绍

因此,这些天我正在为即将推出的Oracle云服务开发新的REST API,因此我需要做的事情之一就是能够为模型中的bean自动生成JSON模式。 我正在使用MOXy从POJO生成JSON,从EclipseLink 2.5.1版本开始,它现在具有从bean模型生成JSON模式的能力。

将来会有一个更加正式的解决方案集成到Jersey 2.x; 但是如果您想尝试一下,此解决方案目前就可以使用。

因此,我们需要设置的第一类是模型处理器,这是非常内部的Jersey类,它允许我们使用额外的方法和资源来修改资源模型。 我们可以向模型中的每个资源添加JsonSchemaHandler ,以完成生成新模式的艰苦工作。 由于这是一个简单的POC,因此这里没有缓存,如果要在生产代码中使用它,请注意这一点。

import com.google.common.collect.Lists;import example.Bean;import java.io.IOException;
import java.io.StringWriter;import java.text.SimpleDateFormat;import java.util.Date;
import java.util.List;import javax.inject.Inject;import javax.ws.rs.HttpMethod;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.core.Configuration;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;import javax.xml.bind.JAXBException;
import javax.xml.bind.SchemaOutputResolver;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;import org.eclipse.persistence.jaxb.JAXBContext;import org.glassfish.jersey.process.Inflector;
import org.glassfish.jersey.server.ExtendedUriInfo;
import org.glassfish.jersey.server.model.ModelProcessor;
import org.glassfish.jersey.server.model.ResourceMethod;
import org.glassfish.jersey.server.model.ResourceModel;
import org.glassfish.jersey.server.model.RuntimeResource;
import org.glassfish.jersey.server.model.internal.ModelProcessorUtil;
import org.glassfish.jersey.server.wadl.internal.WadlResource;public class JsonSchemaModelProcessor implements ModelProcessor {private static final MediaType JSON_SCHEMA_TYPE = MediaType.valueOf("application/schema+json");private final List<ModelProcessorUtil.Method> methodList;public JsonSchemaModelProcessor() {methodList = Lists.newArrayList();methodList.add(new ModelProcessorUtil.Method("$schema", HttpMethod.GET, MediaType.WILDCARD_TYPE, JSON_SCHEMA_TYPE,JsonSchemaHandler.class));}@Overridepublic ResourceModel processResourceModel(ResourceModel resourceModel, Configuration configuration) {return ModelProcessorUtil.enhanceResourceModel(resourceModel, true, methodList, true).build();}@Overridepublic ResourceModel processSubResource(ResourceModel resourceModel, Configuration configuration) {return ModelProcessorUtil.enhanceResourceModel(resourceModel, true, methodList, true).build();}public static class JsonSchemaHandler implements Inflector<ContainerRequestContext, Response> {private final String lastModified = new SimpleDateFormat(WadlResource.HTTPDATEFORMAT).format(new Date());@Injectprivate ExtendedUriInfo extendedUriInfo;@Overridepublic Response apply(ContainerRequestContext containerRequestContext) {// Find the resource that we are decorating, then work out the// return type on the first GETList<RuntimeResource> ms = extendedUriInfo.getMatchedRuntimeResources();List<ResourceMethod> rms = ms.get(1).getResourceMethods();Class responseType = null;found:for (ResourceMethod rm : rms) {if ("GET".equals(rm.getHttpMethod())) {responseType = (Class) rm.getInvocable().getResponseType();break found;}}if (responseType == null) {throw new WebApplicationException("Cannot resolve type for schema generation");}//try {JAXBContext context = (JAXBContext) JAXBContext.newInstance(responseType);StringWriter sw = new StringWriter();final StreamResult sr = new StreamResult(sw);context.generateJsonSchema(new SchemaOutputResolver() {@Overridepublic Result createOutput(String namespaceUri, String suggestedFileName) throws IOException {return sr;}}, responseType);return Response.ok().type(JSON_SCHEMA_TYPE).header("Last-modified", lastModified).entity(sw.toString()).build();} catch (JAXBException jaxb) {throw new WebApplicationException(jaxb);}}}}

请注意, JsonSchemaHandler代码中的非常简单的启发式方法假定每个资源都有1:1映射到单个JSON Schema元素。 当然,这可能不适用于您的特定应用程序。

现在,我们已经在一个已知的位置生成了架构,我们需要将其告知客户,我们要做的第一件事是确保当用户在特定资源上调用OPTIONS时,有一个合适的链接头:

import java.io.IOException;import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Link;
import javax.ws.rs.core.UriInfo;public class JsonSchemaResponseFilter implements ContainerResponseFilter {@Contextprivate UriInfo uriInfo;@Overridepublic void filter(ContainerRequestContext containerRequestContext,ContainerResponseContext containerResponseContext) throws IOException {String method = containerRequestContext.getMethod();if ("OPTIONS".equals(method)) {Link schemaUriLink =Link.fromUriBuilder(uriInfo.getRequestUriBuilder().path("$schema")).rel("describedBy").build();containerResponseContext.getHeaders().add("Link", schemaUriLink);}}
}

由于这是JAX-RS 2.x,因此我们正在与之合作,将所有内容捆绑为一个功能:

import javax.ws.rs.core.Feature;
import javax.ws.rs.core.FeatureContext;public class JsonSchemaFeature implements Feature {@Overridepublic boolean configure(FeatureContext featureContext) {if (!featureContext.getConfiguration().isRegistered(JsonSchemaModelProcessor.class)) {featureContext.register(JsonSchemaModelProcessor.class);featureContext.register(JsonSchemaResponseFilter.class);return true;}return false;}
}

我不会展示我的整个POJO类集。 但是很快,这就是模式生成代码所需的带有@GET方法的Resource类:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;@Path("/bean")
public class BeanResource {@GET@Produces(MediaType.APPLICATION_JSON)public Bean getBean() {return new Bean();}
}

最后,如果对资源执行GET,将看到以下内容:

GET .../resources/bean
Content-Type: application/json{"message" : "hello","other" : {"message" : "OtherBean"},"strings" : ["one","two","three","four"]
}

和选项:

OPTIONS .../resources/bean
Content-Type: text/plain
Link: <http://.../resources/bean/$schema>; rel="describedBy"GET, OPTIONS, HEAD

最后,如果您解析模式资源:

GET .../resources/bean/$schema
Content-Type: application/schema+json{"$schema" : "http://json-schema.org/draft-04/schema#","title" : "example.Bean","type" : "object","properties" : {"message" : {"type" : "string"},"other" : {"$ref" : "#/definitions/OtherBean"},"strings" : {"type" : "array","items" : {"type" : "string"}}},"additionalProperties" : false,"definitions" : {"OtherBean" : {"type" : "object","properties" : {"message" : {"type" : "string"}},"additionalProperties" : false}}
}

这里有很多工作要做,特别是根据我不久前转发到Jersey 2.xa的声明性链接注释生成超媒体扩展。 但这确实指向解决方案,我们可以运用各种解决方案使某些事情现在起作用。

翻译自: https://www.javacodegeeks.com/2014/04/quick-and-a-bit-dirty-json-schema-generation-with-moxy-2-5-1.html

moxy json介绍

moxy json介绍_使用MOXy 2.5.1快速且有点脏的JSON模式生成相关推荐

  1. moxy json介绍_通过MOXy实现使您的JAXB更清洁

    moxy json介绍 编组和解组XML时使用JAXB的主要优点是编程模型. 只需注释几个POJO并使用JAXB API,您就可以很容易地序列化为XML和从XML反序列化. 您无需担心有关XML如何编 ...

  2. 使用MOXy 2.5.1快速且有点脏的JSON模式生成

    因此,这些天我正在为即将推出的Oracle云服务开发新的REST API,因此我需要做的事情之一就是能够为模型中的bean自动生成JSON模式. 我正在使用MOXy从POJO生成JSON,从Eclip ...

  3. pg数据库json数据类型_科学网—如何使用PostgreSQL中的JSONB数据类型(PG JSON系列2) - 孙鹏的博文...

    上一篇 使用PostgreSQL中的row_to_json()直接获得JSON(PG JSON系列1)主要针对现有的非json/jsonb类型如何输出json结果,这一篇主要写一下在数据库设计中直接使 ...

  4. python读取json文件多个json数据_在Python中加载和解析包含多个JSON对象的JSO...

    我试图在Python中加载和解析一个JSON文件.但我试图加载该文件: import json json_data = open('file') data = json.load(json_data) ...

  5. 阿里云rds for mysql平台介绍_阿里云RDS for MySQL 快速入门——笔记

    1初始化配置 1.1设置白名单 创建RDS实例后,需要设置RDS实例的白名单,以允许外部设备访问该RDS实例.默认的白名单只包含默认IP地址127.0.0.1,表示任何设备均无法访问该RDS实例. 设 ...

  6. moxy json介绍_MOXy的@XmlVariableNode – JSON模式示例

    moxy json介绍 我们正在向EclipseLink MOXy添加从域模型生成JSON模式的 功能 . 为此,我们创建了一个新的变量节点映射. 在本文中,我将通过将Java模型映射到JSON模式来 ...

  7. moxy json介绍_MOXy是GlassFish 4中新的默认JSON绑定提供程序

    moxy json介绍 GlassFish 4现在可以提供完整的Java EE 7(JSR-342)平台. EclipseLink为该发行版做出了一些重大贡献. 首先是提供JPA 2.1(JSR-33 ...

  8. moxy json介绍_MOXy的对象图– XML和JSON的输入/输出局部模型

    moxy json介绍 假设您有一个要公开为RESTful服务的域模型. 问题是您只想输入/输出部分数据. 以前,您将创建一个代表子集的单独模型,然后使用代码在模型之间移动数据. 在EclipseLi ...

  9. moxy json介绍_MOXy的对象图和动态JAXB

    moxy json介绍 JAXB(JSR-222)使您可以轻松地将域类的实例转换为XML. EclipseLink MOXy实现提供了一个称为Dynamic JAXB的扩展,在其中,您可以使用诸如Dy ...

最新文章

  1. Windows Phone 的控件倾斜效果
  2. 计算机C语言知识点免费下载,全国计算机二级C语言知识点
  3. vue axios 发送get请求传递参数给后端失败_Java之Vue插件之Axios
  4. 如何安全使用SWT的显示器asyncExec
  5. python二维表转一维表_二维表格转换成一维表格
  6. Python基础-3内建函数 type() cmp()
  7. 【Lolttery】项目开发日志 (七)socket io 结合 react js实现简单聊天室
  8. Windows下GDAL3.1.2编译 (VS2015)
  9. contest13 CF197div2 oooxx ooooo ooooo
  10. 线性代数(四)n维向量
  11. Zero-shot Learning零样本学习 论文阅读(五)——DeViSE:A Deep Visual-Semantic Embedding Model
  12. 【数据结构与算法】之深入解析RSA加密算法的实现原理
  13. 项目开发过程中的管理规范
  14. Win系统 - 教你解决打印机无法安装驱动程序的问题
  15. 引用拷贝、对象拷贝、浅拷贝、深拷贝 到底是什么【详细例子介绍】
  16. Channel L 自然拼读法 Teacher:Lamb
  17. 55个常用的JavaScript网页脚本
  18. python保留n位小数,逢尾进一
  19. 往事如烟 - 笑傲江湖
  20. Cannot load configuration class org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

热门文章

  1. P1463-[POI2002][HAOI2007]反素数【约数,数论】
  2. codeforces1451 C. String Equality
  3. 【主席树】更为厉害(P3899)
  4. 初一模拟赛(5.4)
  5. CVPR19 基于图卷积网络的多标签图像识别模型 论文笔记
  6. NIO学习–核心概念与基本读写
  7. 【程序员】保持一颗虚心好学的心态去敲代码
  8. 《下辈子还教书》经典语录(1)
  9. java实现打印菱形
  10. Android之ZXing扫描二维码以及生成二维码