由于工作的原因,接触了SDO,在研发的过程中遇到很多类型转换方面的问题,网上相应的中文资料比较少,自己总结了一些tip,希望对大家有所帮助
将一个DataObject赋予另一个同schema生成的DataObject时,报
Exception in thread "main" java.lang.ClassCastException: The feature 'ReceiveOrder's type
'ReceiveOrder' does not permit a
value of type 'ReceiveOrder'
at org.eclipse.emf.ecore.impl.EStructuralFeatureImpl$BasicFeatureMapEntry.
validate(EStructuralFeatureImpl.java:2843)
at org.eclipse.emf.ecore.util.FeatureMapUtil.createEntry(FeatureMapUtil.java:146)
at org.eclipse.emf.ecore.util.BasicFeatureMap.createEntry(BasicFeatureMap.java:94)
at org.eclipse.emf.ecore.util.BasicFeatureMap.set(BasicFeatureMap.java:1051)
at org.eclipse.emf.ecore.util.FeatureMapUtil$FeatureValue.set(FeatureMapUtil.java:1149)
at org.eclipse.emf.ecore.impl.EStructuralFeatureImpl$InternalSettingDelegateFeatureMapDelegator
.dynamicSet(EStructuralFeatureImpl.java:1401)
at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eDynamicSet(BasicEObjectImpl.java:709)
at org.apache.tuscany.sdo.impl.DynamicDataObjectImpl.eDynamicSet(DynamicDataObjectImpl.java:160)
at org.apache.tuscany.sdo.impl.DataObjectImpl.eSet(DataObjectImpl.java:1476)
at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eSet(BasicEObjectImpl.java:654)
at org.apache.tuscany.sdo.helper.XMLDocumentImpl.save(XMLDocumentImpl.java:204)
at org.apache.tuscany.sdo.helper.XMLDocumentImpl.save(XMLDocumentImpl.java:160)
at org.apache.tuscany.sdo.helper.XMLDocumentImpl.save(XMLDocumentImpl.java:167)
at org.apache.tuscany.sdo.helper.XMLHelperImpl.save(XMLHelperImpl.java:168)
at org.apache.tuscany.sdo.helper.XMLHelperImpl.save(XMLHelperImpl.java:130)
我们看下试验的代码:
//从字符串创造DataObject
String dataObjectStr =
"<m:ReceiveOrder xmlns:m=\"http://ordertomanufacturingservice.services.starflow.ro.icss.com/wsdl\">" +
"<orderId>testreciiveServcice11111</orderId>" +
"<customerId>String</customerId>" +
"<customerName>String</customerName>" +
"<orderItems>" +
"<orderItem> " +
"<productName>String</productName>" +
"<price>3.1415926535897932384626433832795</price>" +
"<quantity>String</quantity>" +
"<comment>String</comment>" +
"<shipDate>String</shipDate> " +
"</orderItem>" +
"</orderItems>" +
"</m:ReceiveOrder>";
//创造第一个DataObject
HelperContext scope = SDOUtil.createHelperContext();
loadTypesFromXMLSchemaStr(scope,schema3);
XMLDocument xmlDoc = getXMLDocumentFromString(scope,dataObjectStr);
DataObject root = xmlDoc.getRootObject();
//创造第二个DataObject
HelperContext scope2 = SDOUtil.createHelperContext();
DataObject obj = createRootDataObject(scope2,schema3,"ReceiveOrder");
//将第一个DO赋予第二个DO
obj = root;
String xmlstr = scope2.getXMLHelper().save(obj, getNameSpaceFromSchema(schema3),
"ReceiveOrder");
System.out.println(xmlstr);
/**
* 从字符串中获取XMLDocument对象
* @param scope
* @param xmlDoc
* @return
* @throws IOException
*/
private static XMLDocument getXMLDocumentFromString(HelperContext scope,
String xmlDoc) throws IOException {
InputStream is = new ByteArrayInputStream(xmlDoc.getBytes());
XMLDocument result = scope.getXMLHelper().load(is);
return result;
}
/**
* 创建文档的顶层DO
* @param schemaStr
* @param type
* @return
* @throws UnsupportedEncodingException
* @throws FileNotFoundException
*/
private static DataObject createRootDataObject(HelperContext scope,String schemaStr
,String type) throws UnsupportedEncodingException, FileNotFoundException{
loadTypesFromXMLSchemaStr(scope,schemaStr);
DataFactory factory = scope.getDataFactory();
DataObject root = factory.create(getNameSpaceFromSchema(schemaStr),type);
return root;
}
打印结果如下:
Exception in thread "main" java.lang.ClassCastException: The feature 'ReceiveOrder's type
'ReceiveOrder' does not permit a value of type 'ReceiveOrder'
at org.eclipse.emf.ecore.impl.EStructuralFeatureImpl$BasicFeatureMapEntry
.validate(EStructuralFeatureImpl.java:2843)
at org.eclipse.emf.ecore.util.FeatureMapUtil.createEntry(FeatureMapUtil.java:146)
at org.eclipse.emf.ecore.util.BasicFeatureMap.createEntry(BasicFeatureMap.java:94)
at org.eclipse.emf.ecore.util.BasicFeatureMap.set(BasicFeatureMap.java:1051)
at org.eclipse.emf.ecore.util.FeatureMapUtil$FeatureValue.set(FeatureMapUtil.java:1149)
at org.eclipse.emf.ecore.impl.EStructuralFeatureImpl$InternalSettingDelegateFeatureMapDelegator
.dynamicSet(EStructuralFeatureImpl.java:1401)
at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eDynamicSet(BasicEObjectImpl.java:709)
at org.apache.tuscany.sdo.impl.DynamicDataObjectImpl.eDynamicSet(DynamicDataObjectImpl.java:160)
at org.apache.tuscany.sdo.impl.DataObjectImpl.eSet(DataObjectImpl.java:1476)
at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eSet(BasicEObjectImpl.java:654)
at org.apache.tuscany.sdo.helper.XMLDocumentImpl.save(XMLDocumentImpl.java:204)
at org.apache.tuscany.sdo.helper.XMLDocumentImpl.save(XMLDocumentImpl.java:160)
at org.apache.tuscany.sdo.helper.XMLDocumentImpl.save(XMLDocumentImpl.java:167)
at org.apache.tuscany.sdo.helper.XMLHelperImpl.save(XMLHelperImpl.java:168)
at org.apache.tuscany.sdo.helper.XMLHelperImpl.save(XMLHelperImpl.java:130)
at com.icss.ro.starflow.service.mappingservice.Test2.main(Test2.java:305)
这就奇怪了,我明明用同样的schema创建的两个对象,按照java中最基本的赋值原则,我这样直接给DO赋值也应该没错啊,百思不得其解。仔细观察发现,两个DO虽然属于同一个schema,但隶属于不同的HelperContext,问题会不会出在这里呢,我们再试验下,代码修改为:
//创造第一个DataObject
HelperContext scope = SDOUtil.createHelperContext();
loadTypesFromXMLSchemaStr(scope,schema3);
XMLDocument xmlDoc = getXMLDocumentFromString(scope,dataObjectStr);
DataObject root = xmlDoc.getRootObject();
//创造第二个DataObject
HelperContext scope2 = SDOUtil.createHelperContext();
DataObject obj = createRootDataObject(scope,schema3,"ReceiveOrder");
//将第一个DO赋予第二个DO
obj = root;
String xmlstr = scope.getXMLHelper().save(obj, getNameSpaceFromSchema(schema3),
"ReceiveOrder");
System.out.println(xmlstr);
这时的打印结果为:
<?xml version="1.0" encoding="UTF-8"?>
<tns:ReceiveOrder xmlns:tns="http://ordertomanufacturingservice.services.starflow.ro.icss.com/wsdl">
<orderId>testreciiveServcice11111</orderId>
<customerId>String</customerId>
<customerName>String</customerName>
<orderItems>
<orderItem>
<productName>String</productName>
<price>3.1415926535897932384626433832795</price>
<quantity>String</quantity>
<comment>String</comment>
<shipDate>String</shipDate>
</orderItem>
</orderItems>
</tns:ReceiveOrder>
通过这个例子,我们发现,如果要给两个DO赋值的话,它不单要隶属于同一个xsd文件的同一个类型,而且还要隶属同一个HelperConetxt,否则就要报如上的异常了。
分享到:
- 2008-08-30 03:29
- 浏览 994
- 评论(0)
- 论坛回复 / 浏览 (0 / 2304)
- 查看更多
相关推荐
在实际操作中,可能会遇到一些问题,如坐标系统的转换、字符编码问题、数据类型的不匹配等。这些问题需要根据具体情况解决,例如使用`shp2sdo`的额外参数进行配置,或者在导入前对数据进行预处理。 总之,`shp2sdo`...
5. 数据长度和数据类型:确保PDO传输的数据长度和类型与设备实际的输入/输出匹配。 在实际应用中,使用STM32 HAL库配置PDO时,需要调用相关的函数进行初始化和设置,例如`HAL_CAN_ConfigTPDO`、`HAL_CAN_ConfigRPDO...
需要注意的是,转换过程中可能遇到的问题包括不兼容的数据类型、空间参考系统的不匹配、权限问题等。解决这些问题可能需要对SHP文件进行预处理,或者调整数据库的配置。 总之,"shp2sdo"工具提供了一种便捷的方法,...
Oracle Spatial定义了一种特殊的索引类型——SPATIAL INDEX,以及一系列相关空间算子,如SDO-RELATE、SDO-FILTER等。这些算子可以配合索引进行高效的查询,避免全表扫描,提高查询效率。例如,SDO-FILTER算子用于...
首先,它们不支持LOB(Large Object)类型,如SDO_GEOMETRY,这在处理空间数据时可能会成为问题。其次,临时表不支持主外键约束,这限制了表之间的参照完整性。 为了解决这些问题,可以采取自定义的临时表处理方法...
在IT行业中,地图信息系统(GIS)是...在实际操作中,可能还会遇到兼容性问题、数据精度问题、空间参考系匹配等问题,需要根据具体情况调整和解决。熟悉GIS数据处理和Oracle数据库管理的技巧是顺利完成此任务的关键。
- **高精度相位匹配**:确保两通道之间的相位差不超过2度。 - **增益匹配**:保证增益匹配精度在0.2dB以内。 - **可配置滤波器类型**:既可作为五阶低通滤波器使用(频率范围42kHz至900kHz),也可作为四阶高通...
- **SDO_GEOMETRY 中的三维数据表示**:Oracle Spatial 11g 支持使用 SDO_GEOMETRY 类型来表示三维数据,如点、线、简单表面、合成表面、简单实体以及合成实体等。 ##### 1.2 Web 服务增强 - **Web 地理特征服务 ...
- **处理映射错误**:列举了一些常见的映射错误及其解决方法,如地址冲突、数据长度不匹配等。 - **虚拟映射**:介绍了在某些情况下使用虚拟PDO作为占位符的概念,以保持网络通信的一致性和稳定性。 - **服务数据...
- **编译与调试**:编译程序,检查语法错误和类型不匹配,通过调试工具进行测试。 - **下载与运行**:将编译好的程序下载到PLC中,监控运行状态,根据需要进行调整优化。 5. **学习资源** 《S7-SCL 编程.pdf》这...
这里使用`MDSYS.SPATIAL_INDEX`索引类型创建了一个名为`jimaoshichangsuoyin`的索引。 第二部分**空间数据迁移**主要涉及数据的转移和表结构的调整: 1. **创建新表**: - 为了迁移数据,首先创建一个新的表`...
CAN通讯是一种广泛应用于...总的来说,CAN通讯是工业自动化中不可或缺的一部分,而Vacon的CAN Open选件卡使得其NX变频器能够充分利用这一协议的优势,实现与其他CANOPEN设备的高效通信,提升了整个系统的性能和可靠性。
空间数据被存储为特殊的数据类型,如SDO_GEOMETRY。 由于数据存储格式的不同,直接在ARCSDE和Oracle9iSpatial之间进行数据转换会面临挑战。为了实现转换,我们需要遵循以下步骤: 1. 数据抽取:首先,从ARCSDE中...
在文档中提及的Oracle的SDO_GEORASTER对象,是Oracle数据库中用于存储栅格数据的特殊数据类型。Oracle Georaster是一个地理空间数据模型,它能够高效地存储和分析栅格数据。它的主要特性包括但不限于以下几个方面: ...
Oracle Spatial支持的对象-关系模型是符合OpenGIS ODBC/SQL空间几何特征规范的,允许在一个单一的MDSYS.SDO_GEOMETRY列中存储几何实体。这种模型有以下几个优点: 1. 支持多种几何类型,提高了数据的多样性。 2. ...
总结来说,Oracle9i Spatial空间数据库通过支持复杂空间数据类型的存储和管理,提供强大的空间索引和空间分析工具,极大地提升了空间数据处理的能力和效率。这对于地理信息系统(GIS)、城市规划、资源管理以及需要...
3. **SDI and SDO**:串行数据输入(SDI)和串行数据输出(SDO)是串行通信接口,允许微控制器与其他设备交换数据。 4. **5V电源**:提供电路所需的电源,确保各组件正常工作。 5. **J2CON5, J6/NC, J4火焰传感器,...