创建 DynamicEntities 时出现问题 - DynamicHelper.createQuery:找不到动态类型:

Problems creating DynamicEntities - DynamicHelper.createQuery: Dynamic type not found:

我似乎遇到了一个问题,在我的生活中我不明白为什么。我怀疑这是一个名字 space 问题。

以下代码总是导致以下错误:DynamicHelper.createQuery:找不到动态类型:

我试过很多名字spaces

我完全预料到这是用户错误。欢迎任何指导。

JAVA 代码:

package model;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import javax.xml.bind.JAXBException;

import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContextFactory;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class Test
{

    public static void main(String[] args)
    {
        try {
            URL schema = new URL("http://localhost:8080/stockcontrol/schema/stockcontrol.xsd");
            InputStream xsd = schema.openStream();

            EntityResolver er = new EntityResolver()
            {
                @Override
                public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException
                {
                    URL schema = new URL("http://localhost:8080/stockcontrol/schema/"+(new File(systemId)).getName());
                    InputStream xsd = schema.openStream();

                    InputSource is = new InputSource(xsd);
                    is.setSystemId(schema.getPath());
                    return is;
                }
            };
            //create the context from the XSD 
            DynamicJAXBContext xmlContext = DynamicJAXBContextFactory.createContextFromXSD(xsd,er, null, null);

            //create a DYNAMICEntity for the supplier object.
            DynamicEntity de = xmlContext.newDynamicEntity("mmckenzie.stockcontrol/supplier");
        }
        catch (IOException | JAXBException e)
        {
            e.printStackTrace();
        }
    }
}

XSD

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="mmckenzie.stockcontrol" xmlns:tns="mmckenzie.stockcontrol" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:import schemaLocation="stockcontrol2.xsd"/>

  <xs:element name="batch" type="tns:batchDAO"/>

  <xs:element name="batches" type="tns:batchesDAO"/>

  <xs:element name="component" type="tns:componentDAO"/>

  <xs:element name="components" type="tns:componentsDAO"/>

  <xs:element name="prefixes" type="tns:componentPrefixesDAO"/>

  <xs:element name="product" type="tns:productDAO"/>

  <xs:element name="product_batches" type="tns:productBatchesDAO"/>

  <xs:element name="productbatch" type="tns:productBatchDAO"/>

  <xs:element name="products" type="tns:productsDAO"/>

  <xs:element name="supplier" type="tns:supplierDAO"/>

  <xs:element name="suppliers" type="tns:suppliersDAO"/>

  <xs:complexType name="batchesDAO">
    <xs:sequence>
      <xs:element name="batch" type="tns:batchDAO" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="batchDAO">
    <xs:sequence>
      <xs:element name="idbatch" type="xs:int"/>
      <xs:element name="dateReceived" type="xs:long"/>
      <xs:element name="dateConsumed" type="xs:long"/>
      <xs:element name="invoice" type="xs:string" minOccurs="0"/>
      <xs:element name="qty" type="xs:int"/>
      <xs:element name="qtyInStock" type="xs:int"/>
      <xs:element name="unitCost" type="xs:decimal" minOccurs="0"/>
      <xs:element name="componentId" type="xs:int"/>
      <xs:element name="supplierId" type="xs:int"/>
      <xs:element name="unitType" type="unitType" minOccurs="0"/>
      <xs:element name="isActive" type="xs:boolean"/>
      <xs:element ref="tns:products" minOccurs="0"/>
      <xs:element name="batchCost" type="xs:decimal" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="productsDAO">
    <xs:sequence>
      <xs:element name="product" type="tns:productDAO" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="productDAO">
    <xs:sequence>
      <xs:element name="idProduct" type="xs:int"/>
      <xs:element name="cost" type="xs:decimal" minOccurs="0"/>
      <xs:element name="description" type="xs:string" minOccurs="0"/>
      <xs:element name="quantity" type="xs:int"/>
      <xs:element name="sellPrice" type="xs:decimal" minOccurs="0"/>
      <xs:element name="productBatches" type="tns:productBatchesDAO" minOccurs="0"/>
      <xs:element name="date_sold" type="timestamp" minOccurs="0"/>
      <xs:element name="date_produced" type="timestamp" minOccurs="0"/>
      <xs:element ref="tns:components" minOccurs="0"/>
      <xs:element name="hours_worked" type="xs:double"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="productBatchesDAO">
    <xs:sequence>
      <xs:element name="productbatches" type="tns:productBatchDAO" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="productBatchDAO">
    <xs:sequence>
      <xs:element ref="tns:component" minOccurs="0"/>
      <xs:element ref="tns:batch" minOccurs="0"/>
      <xs:element name="quantyUsed" type="xs:int"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="componentDAO">
    <xs:sequence>
      <xs:element name="idcomponent" type="xs:int"/>
      <xs:element name="componentName" type="xs:string" minOccurs="0"/>
      <xs:element ref="tns:batches" minOccurs="0"/>
      <xs:element name="componentPrefix" type="componentPrefix" minOccurs="0"/>
      <xs:element name="qtyInStock" type="xs:int"/>
      <xs:element ref="tns:products" minOccurs="0"/>
      <xs:element name="quantity" type="xs:int"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="componentsDAO">
    <xs:sequence>
      <xs:element name="component" type="tns:componentDAO" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="suppliersDAO">
    <xs:sequence>
      <xs:element name="supplier" type="tns:supplierDAO" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="supplierDAO">
    <xs:sequence>
      <xs:element name="idsupplier" type="xs:int"/>
      <xs:element name="modified" type="timestamp" minOccurs="0"/>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
      <xs:element ref="tns:batches" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="componentPrefixesDAO">
    <xs:sequence>
      <xs:element name="prefix" type="componentPrefix" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

欢迎所有评论建议。

它创建命名空间的方式不是我所期望的。这个例子的正确答案是

DynamicEntity de = xmlContext.newDynamicEntity("stockcontrol.mmckenzie.SupplierDAO");

这篇文章有助于找到解决方案。 附录 D:XML 架构的 XML 绑定 XML 名称到 Java 标识符” 绑定 (JAXB) 2.2 规范 (http://jcp.org/en/jsr/detail?id=222)

但是使用 eclipse 调试器我能够找到帮助程序命名空间。要使用此方法,请在 eclipse 中执行以下步骤(mycase 中为 Mars)。

  1. 在 DynamicJAXBContext 代码之后使用断点在调试器中启动您的应用程序。
  2. 在 eclipse 变量选项卡中,找到您的 DynamicJAXBContext 对象。
  3. (你的上下文)->ContextState->Helpers->ElementData->(非空对象)->fqClassNameToDescripters->table->(非空条目)->key

键值会让您了解它期望的命名空间。