创建 DynamicEntities 时出现问题 - DynamicHelper.createQuery:找不到动态类型:
Problems creating DynamicEntities - DynamicHelper.createQuery: Dynamic type not found:
我似乎遇到了一个问题,在我的生活中我不明白为什么。我怀疑这是一个名字 space 问题。
以下代码总是导致以下错误:DynamicHelper.createQuery:找不到动态类型:
我试过很多名字spaces
- "mmckenzie.stockcontrol/supplier"
- "supplier"
- "supplierDAO"
- "mmckenzie.stockcontrol/supplierDAO"
我完全预料到这是用户错误。欢迎任何指导。
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)。
- 在 DynamicJAXBContext 代码之后使用断点在调试器中启动您的应用程序。
- 在 eclipse 变量选项卡中,找到您的 DynamicJAXBContext 对象。
- (你的上下文)->ContextState->Helpers->ElementData->(非空对象)->fqClassNameToDescripters->table->(非空条目)->key
键值会让您了解它期望的命名空间。
我似乎遇到了一个问题,在我的生活中我不明白为什么。我怀疑这是一个名字 space 问题。
以下代码总是导致以下错误:DynamicHelper.createQuery:找不到动态类型:
我试过很多名字spaces
- "mmckenzie.stockcontrol/supplier"
- "supplier"
- "supplierDAO"
- "mmckenzie.stockcontrol/supplierDAO"
我完全预料到这是用户错误。欢迎任何指导。
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)。
- 在 DynamicJAXBContext 代码之后使用断点在调试器中启动您的应用程序。
- 在 eclipse 变量选项卡中,找到您的 DynamicJAXBContext 对象。
- (你的上下文)->ContextState->Helpers->ElementData->(非空对象)->fqClassNameToDescripters->table->(非空条目)->key
键值会让您了解它期望的命名空间。