我们可以将jaxb上下文绑定保存到oxm元数据文件吗?

鲁尼孔

我们有机会从外部oxm文件初始化jaxb上下文

Map<String, Object> props = new HashMap<String, Object>(1);
props.put(JAXBContextProperties.OXM_METADATA_SOURCE, "oxm.xml");
JAXBContext jc = JAXBContextFactory.createContext(new Class[0], props, <ClassLoader>);

我们可以安全地将当前jaxb上下文xml绑定到xml吗?从jaxb注释类初始化的上下文中(我有jaxb.properties)

JAXBContext jc = JAXBContext.newInstance(new Class[]{...});

就像我将生成的架构保存到文件一样

jc.generateSchema(new SchemaOutputResolver(){...});

我只需要以日期/时间表示形式的差异来编写模式的oxm文件。

鲁尼孔

我创建了从包创建oxm的函数。它还不完整,但是可以做我需要的一切,并且很好地作为起点...

  public static void createOXM(Package pack, String filename)
    throws Exception
  {
    /*
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="eclipselink_oxm_2_4.xsd"
                  xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="<name>"
                  xml-mapping-metadata-complete="true" xml-accessor-type="NONE" xml-accessor-order="UNDEFINED">
    */

    org.eclipse.persistence.jaxb.xmlmodel.XmlBindings bindings =
      new org.eclipse.persistence.jaxb.xmlmodel.XmlBindings();

    bindings.setPackageName(pack.getName());
    bindings.setXmlMappingMetadataComplete(true);
    bindings.setXmlAccessorType(org.eclipse.persistence.jaxb.xmlmodel.XmlAccessType.NONE);
    bindings.setXmlAccessorOrder(org.eclipse.persistence.jaxb.xmlmodel.XmlAccessOrder.UNDEFINED);

    List<Class<?>> classes = getClassesForPackage(pack);

    for (Class<?> cls: classes)
    {
      int clsMod = cls.getModifiers();
      String clsName = cls.getName().replaceAll("[^\\.]+\\.", "");

      if (cls.isAnonymousClass() || !Modifier.isPublic(clsMod)) // Class$1 etc...
        continue;

      if (cls.getAnnotation(XmlTransient.class) != null)
        continue;

      org.eclipse.persistence.jaxb.xmlmodel.XmlBindings.JavaTypes javaTypes = bindings.getJavaTypes();

      if (javaTypes == null)
      {
        javaTypes = new org.eclipse.persistence.jaxb.xmlmodel.XmlBindings.JavaTypes();
        bindings.setJavaTypes(javaTypes);
      }

      org.eclipse.persistence.jaxb.xmlmodel.JavaType javaType = new org.eclipse.persistence.jaxb.xmlmodel.JavaType();
      javaTypes.getJavaType().add(javaType);
      javaType.setName(clsName);

      XmlRootElement xmlRoot = cls.getAnnotation(XmlRootElement.class);
      if (xmlRoot != null)
      {
        org.eclipse.persistence.jaxb.xmlmodel.XmlRootElement root =
          new org.eclipse.persistence.jaxb.xmlmodel.XmlRootElement();
        javaType.setXmlRootElement(root);

        if (!"##default".equals(xmlRoot.name()))
          root.setName(xmlRoot.name());

        if (!"##default".equals(xmlRoot.namespace()))
          root.setNamespace(xmlRoot.namespace());
      }

      XmlType xmlType = cls.getAnnotation(XmlType.class);
      if (xmlType != null)
      {
        org.eclipse.persistence.jaxb.xmlmodel.XmlType type = new org.eclipse.persistence.jaxb.xmlmodel.XmlType();
        javaType.setXmlType(type);

        if (!"##default".equals(xmlType.name()))
          type.setName(xmlType.name());

        if (!"##default".equals(xmlType.namespace()))
          type.setNamespace(xmlType.namespace());

        String[] props = xmlType.propOrder();

        if (props != null && props.length > 0)
        {
          for (String prop: props)
            if (!prop.trim().isEmpty())
              type.getPropOrder().add(prop.trim());
        }
      }

      XmlAccessorType xmlAccType = cls.getAnnotation(XmlAccessorType.class);
      if (xmlAccType != null)
      {
        String accType = xmlAccType.value().name();
        javaType.setXmlAccessorType(org.eclipse.persistence.jaxb.xmlmodel.XmlAccessType.valueOf(accType));
      }

      if (cls.isEnum())
      {
        org.eclipse.persistence.jaxb.xmlmodel.XmlBindings.XmlEnums enums = bindings.getXmlEnums();

        if (enums == null)
        {
          enums = new org.eclipse.persistence.jaxb.xmlmodel.XmlBindings.XmlEnums();
          bindings.setXmlEnums(enums);
        }

        org.eclipse.persistence.jaxb.xmlmodel.XmlEnum en = new org.eclipse.persistence.jaxb.xmlmodel.XmlEnum();
        en.setJavaEnum(clsName);
        enums.getXmlEnum().add(en);

        XmlEnum xmlEnum = cls.getAnnotation(XmlEnum.class);
        if (xmlEnum != null)
        {
          Class<?> xmlClass = xmlEnum.value();

          if (xmlClass != String.class)
            en.setValue(xmlClass.getName());
        }

        for (Field field: cls.getDeclaredFields())
          if (field.isEnumConstant())
          {
            org.eclipse.persistence.jaxb.xmlmodel.XmlEnumValue value =
              new org.eclipse.persistence.jaxb.xmlmodel.XmlEnumValue();

            en.getXmlEnumValue().add(value);
            value.setJavaEnumValue(field.getName());
            value.setValue(field.getName());

            XmlEnumValue enumValue = field.getAnnotation(XmlEnumValue.class);

            if (enumValue != null)
              value.setValue(enumValue.value());
          }

        continue;
      }

      Class clsSuper = cls.getSuperclass();

      if (clsSuper.getPackage() == pack)
        javaType.setSuperType(clsSuper.getName());

      for (Field field: cls.getDeclaredFields())
      {
        org.eclipse.persistence.jaxb.xmlmodel.JavaType.JavaAttributes javaAttrs = javaType.getJavaAttributes();

        if (javaAttrs == null)
        {
          javaAttrs = new org.eclipse.persistence.jaxb.xmlmodel.JavaType.JavaAttributes();
          javaType.setJavaAttributes(javaAttrs);
        }

        XmlTransient xmlTrans = field.getAnnotation(XmlTransient.class);
        if (xmlTrans != null)
        {
          org.eclipse.persistence.jaxb.xmlmodel.XmlTransient attr =
            new org.eclipse.persistence.jaxb.xmlmodel.XmlTransient();
          attr.setJavaAttribute(field.getName());

          javaAttrs.getJavaAttribute().add(new JAXBElement(new QName("", "xml-transient"), attr.getClass(), attr));
          continue;
        }

        XmlValue xmlValue = field.getAnnotation(XmlValue.class);
        if (xmlValue != null)
        {
          org.eclipse.persistence.jaxb.xmlmodel.XmlValue attr = new org.eclipse.persistence.jaxb.xmlmodel.XmlValue();
          attr.setJavaAttribute(field.getName());

          javaAttrs.getJavaAttribute().add(new JAXBElement(new QName("", "xml-value"), attr.getClass(), attr));
          continue;
        }

        XmlAttribute xmlAttr = field.getAnnotation(XmlAttribute.class);
        if (xmlAttr != null)
        {
          org.eclipse.persistence.jaxb.xmlmodel.XmlAttribute attr =
            new org.eclipse.persistence.jaxb.xmlmodel.XmlAttribute();
          attr.setJavaAttribute(field.getName());

          if (!"##default".equals(xmlAttr.name()) && !field.getName().equals(xmlAttr.name()))
            attr.setName(xmlAttr.name());

          if (!"##default".equals(xmlAttr.namespace()))
            attr.setNamespace(xmlAttr.namespace());

          if (xmlAttr.required())
            attr.setRequired(true);

          XmlSchemaType xmlSchemaType = field.getAnnotation(XmlSchemaType.class);
          if (xmlSchemaType != null)
          {
            org.eclipse.persistence.jaxb.xmlmodel.XmlSchemaType schemaType =
              new org.eclipse.persistence.jaxb.xmlmodel.XmlSchemaType();

            attr.setXmlSchemaType(schemaType);
            schemaType.setName(xmlSchemaType.name());

            if (!"http://www.w3.org/2001/XMLSchema".equals(xmlSchemaType.namespace()))
              schemaType.setName(xmlSchemaType.namespace());

            if (xmlSchemaType.type() != XmlSchemaType.DEFAULT.class)
              schemaType.setType(xmlSchemaType.type().getName());
          }

          XmlJavaTypeAdapter xmlJavaTypeAdapter = field.getAnnotation(XmlJavaTypeAdapter.class);
          if (xmlJavaTypeAdapter != null)
          {
            org.eclipse.persistence.jaxb.xmlmodel.XmlJavaTypeAdapter javaTypeAdapter =
              new org.eclipse.persistence.jaxb.xmlmodel.XmlJavaTypeAdapter();

            attr.setXmlJavaTypeAdapter(javaTypeAdapter);

            if (xmlJavaTypeAdapter.value() != null)
              javaTypeAdapter.setValue(xmlJavaTypeAdapter.value().getName());

            if (xmlJavaTypeAdapter.type() != XmlJavaTypeAdapter.DEFAULT.class)
              javaTypeAdapter.setValue(xmlJavaTypeAdapter.type().getName());
          }

          javaAttrs.getJavaAttribute().add(new JAXBElement(new QName("", "xml-attribute"), attr.getClass(), attr));
          continue;
        }

        XmlElement xmlElem = field.getAnnotation(XmlElement.class);

        if (xmlElem != null && xmlAttr != null)
          throw new RuntimeException("XmlAttribute and XmlElement can be both");

        org.eclipse.persistence.jaxb.xmlmodel.XmlElement attr = new org.eclipse.persistence.jaxb.xmlmodel.XmlElement();
        attr.setJavaAttribute(field.getName());

        if (xmlElem != null)
        {
          if (!"##default".equals(xmlElem.name()) && !field.getName().equals(xmlElem.name()))
            attr.setName(xmlElem.name());

          if (!"##default".equals(xmlElem.namespace()))
            attr.setNamespace(xmlElem.namespace());

          if (!"\u0000".equals(xmlElem.defaultValue()))
            attr.setDefaultValue(xmlElem.defaultValue());

          if (xmlElem.required())
            attr.setRequired(true);

          if (xmlElem.nillable())
            attr.setNillable(true);
        }

        XmlElementWrapper xmlWrapper = field.getAnnotation(XmlElementWrapper.class);
        if (xmlWrapper != null)
        {
          org.eclipse.persistence.jaxb.xmlmodel.XmlElementWrapper elemWrapper =
            new org.eclipse.persistence.jaxb.xmlmodel.XmlElementWrapper();
          attr.setXmlElementWrapper(elemWrapper);

          if (!"##default".equals(xmlWrapper.name()))
            elemWrapper.setName(xmlWrapper.name());

          if (!"##default".equals(xmlWrapper.namespace()))
            elemWrapper.setNamespace(xmlWrapper.namespace());

          if (xmlWrapper.required())
            elemWrapper.setRequired(true);

          if (xmlWrapper.nillable())
            elemWrapper.setNillable(true);
        }

        XmlSchemaType xmlSchemaType = field.getAnnotation(XmlSchemaType.class);
        if (xmlSchemaType != null)
        {
          org.eclipse.persistence.jaxb.xmlmodel.XmlSchemaType schemaType =
            new org.eclipse.persistence.jaxb.xmlmodel.XmlSchemaType();

          attr.setXmlSchemaType(schemaType);
          schemaType.setName(xmlSchemaType.name());

          if (!"http://www.w3.org/2001/XMLSchema".equals(xmlSchemaType.namespace()))
            schemaType.setName(xmlSchemaType.namespace());

          if (xmlSchemaType.type() != XmlSchemaType.DEFAULT.class)
            schemaType.setType(xmlSchemaType.type().getName());
        }

        XmlJavaTypeAdapter xmlJavaTypeAdapter = field.getAnnotation(XmlJavaTypeAdapter.class);
        if (xmlJavaTypeAdapter != null)
        {
          org.eclipse.persistence.jaxb.xmlmodel.XmlJavaTypeAdapter javaTypeAdapter =
            new org.eclipse.persistence.jaxb.xmlmodel.XmlJavaTypeAdapter();

          attr.setXmlJavaTypeAdapter(javaTypeAdapter);

          if (xmlJavaTypeAdapter.value() != null)
            javaTypeAdapter.setValue(xmlJavaTypeAdapter.value().getName());

          if (xmlJavaTypeAdapter.type() != XmlJavaTypeAdapter.DEFAULT.class)
            javaTypeAdapter.setValue(xmlJavaTypeAdapter.type().getName());
        }

        javaAttrs.getJavaAttribute().add(new JAXBElement(new QName("", "xml-element"), attr.getClass(), attr));
      }
    }

    JAXBContext jc = JAXBContext.newInstance(bindings.getClass());
    Marshaller m = jc.createMarshaller();

    m.setProperty(Marshaller.JAXB_ENCODING, "utf-8");
    m.setProperty(Marshaller.JAXB_FRAGMENT, false);
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    m.marshal(bindings, new File(filename));
  }

玩得开心!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

我们可以将哈希表写入文件吗?

来自分类Dev

我们可以像在python中一样在Go中创建上下文管理器吗

来自分类Dev

JavaScript中的“调用上下文”和“执行上下文”:我们在谈论同一件事吗?

来自分类Dev

我们可以在React Context API中创建多个上下文吗?

来自分类Dev

我们可以将浏览器的JavaScript的执行上下文从Window对象更改为其他对象吗?

来自分类Dev

我们可以更改编年史数据文件的名称吗?

来自分类Dev

我们是否必须显式添加到数据库上下文?

来自分类Dev

我们可以在不涉及UI的情况下使用Dialogflow的Node履行库以编程方式设置和删除上下文吗?

来自分类Dev

我们可以在dialogflow中添加超过5个输入上下文吗?

来自分类Dev

我们可以添加外部登录的授权范围并将结果保存到ServiceStack中的数据库中吗?

来自分类Dev

我可以在文本建议栏中插入数据上下文吗?

来自分类Dev

稍后保存上下文-将指针保存到上下文吗?核心数据

来自分类Dev

我们可以将.sql文件导入HSQL数据库吗?

来自分类Dev

为什么将绑定数据上下文设置为控件的数据上下文?

来自分类Dev

我如何将当前上下文保存到Javasccript中的局部变量

来自分类Dev

我可以扩展API控制器来保存数据库上下文的变量吗?

来自分类Dev

在我的域模型中有数据库上下文可以吗

来自分类Dev

我们可以从虚拟PC保存文件吗

来自分类Dev

我们可以在MobileFirst Platform 7.0 Operational Analytics中使用“上下文搜索”吗?(可以通过最小限度限制客户端日志吗?)

来自分类Dev

我们可以将mysql错误保存到文件吗?

来自分类Dev

我们可以使用ANTLR定义非上下文无关的语法吗?

来自分类Dev

我们可以对参数排序然后相应地保存到索引吗?

来自分类Dev

Pouchdb在哪里将附件保存到我们的本地PC?我们可以检查哪个文件夹?

来自分类Dev

我们可以将文件保存在RAM中吗?

来自分类Dev

我们可以将ManagedObject绑定到View吗?

来自分类Dev

我们可以在不显示在层次结构窗口的上下文菜单中的游戏对象菜单中添加菜单项吗?

来自分类Dev

我们可以在不同的任务中同时使用多少个“上下文”?

来自分类Dev

为什么将单个实体保存到我的 EF Core 数据库上下文会导致多次插入?

来自分类Dev

我们可以使用整个文本文件中的文件名来保存数据帧吗?

Related 相关文章

  1. 1

    我们可以将哈希表写入文件吗?

  2. 2

    我们可以像在python中一样在Go中创建上下文管理器吗

  3. 3

    JavaScript中的“调用上下文”和“执行上下文”:我们在谈论同一件事吗?

  4. 4

    我们可以在React Context API中创建多个上下文吗?

  5. 5

    我们可以将浏览器的JavaScript的执行上下文从Window对象更改为其他对象吗?

  6. 6

    我们可以更改编年史数据文件的名称吗?

  7. 7

    我们是否必须显式添加到数据库上下文?

  8. 8

    我们可以在不涉及UI的情况下使用Dialogflow的Node履行库以编程方式设置和删除上下文吗?

  9. 9

    我们可以在dialogflow中添加超过5个输入上下文吗?

  10. 10

    我们可以添加外部登录的授权范围并将结果保存到ServiceStack中的数据库中吗?

  11. 11

    我可以在文本建议栏中插入数据上下文吗?

  12. 12

    稍后保存上下文-将指针保存到上下文吗?核心数据

  13. 13

    我们可以将.sql文件导入HSQL数据库吗?

  14. 14

    为什么将绑定数据上下文设置为控件的数据上下文?

  15. 15

    我如何将当前上下文保存到Javasccript中的局部变量

  16. 16

    我可以扩展API控制器来保存数据库上下文的变量吗?

  17. 17

    在我的域模型中有数据库上下文可以吗

  18. 18

    我们可以从虚拟PC保存文件吗

  19. 19

    我们可以在MobileFirst Platform 7.0 Operational Analytics中使用“上下文搜索”吗?(可以通过最小限度限制客户端日志吗?)

  20. 20

    我们可以将mysql错误保存到文件吗?

  21. 21

    我们可以使用ANTLR定义非上下文无关的语法吗?

  22. 22

    我们可以对参数排序然后相应地保存到索引吗?

  23. 23

    Pouchdb在哪里将附件保存到我们的本地PC?我们可以检查哪个文件夹?

  24. 24

    我们可以将文件保存在RAM中吗?

  25. 25

    我们可以将ManagedObject绑定到View吗?

  26. 26

    我们可以在不显示在层次结构窗口的上下文菜单中的游戏对象菜单中添加菜单项吗?

  27. 27

    我们可以在不同的任务中同时使用多少个“上下文”?

  28. 28

    为什么将单个实体保存到我的 EF Core 数据库上下文会导致多次插入?

  29. 29

    我们可以使用整个文本文件中的文件名来保存数据帧吗?

热门标签

归档