`
marb
  • 浏览: 422290 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SDO之类型不匹配的问题

阅读更多

由于工作的原因,接触了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,否则就要报如上的异常了。

 

 

分享到:
评论

相关推荐

    shp2sdo,shp转oracle,shp转换,oracle识别,实现shp文件转oracle数据库

    在实际操作中,可能会遇到一些问题,如坐标系统的转换、字符编码问题、数据类型的不匹配等。这些问题需要根据具体情况解决,例如使用`shp2sdo`的额外参数进行配置,或者在导入前对数据进行预处理。 总之,`shp2sdo`...

    YSF4_HAL_CANopen-005. SDO - 控制PDO传输方式.rar

    5. 数据长度和数据类型:确保PDO传输的数据长度和类型与设备实际的输入/输出匹配。 在实际应用中,使用STM32 HAL库配置PDO时,需要调用相关的函数进行初始化和设置,例如`HAL_CAN_ConfigTPDO`、`HAL_CAN_ConfigRPDO...

    数字地图格式转换

    需要注意的是,转换过程中可能遇到的问题包括不兼容的数据类型、空间参考系统的不匹配、权限问题等。解决这些问题可能需要对SHP文件进行预处理,或者调整数据库的配置。 总之,"shp2sdo"工具提供了一种便捷的方法,...

    Oracle Spatial的空间查询分析功能浅析.pdf

    Oracle Spatial定义了一种特殊的索引类型——SPATIAL INDEX,以及一系列相关空间算子,如SDO-RELATE、SDO-FILTER等。这些算子可以配合索引进行高效的查询,避免全表扫描,提高查询效率。例如,SDO-FILTER算子用于...

    ORACLE中临时表

    首先,它们不支持LOB(Large Object)类型,如SDO_GEOMETRY,这在处理空间数据时可能会成为问题。其次,临时表不支持主外键约束,这限制了表之间的参照完整性。 为了解决这些问题,可以采取自定义的临时表处理方法...

    用mapinfo7.8上传tab文件到oracle

    在IT行业中,地图信息系统(GIS)是...在实际操作中,可能还会遇到兼容性问题、数据精度问题、空间参考系匹配等问题,需要根据具体情况调整和解决。熟悉GIS数据处理和Oracle数据库管理的技巧是顺利完成此任务的关键。

    LTC6602使用指南

    - **高精度相位匹配**:确保两通道之间的相位差不超过2度。 - **增益匹配**:保证增益匹配精度在0.2dB以内。 - **可配置滤波器类型**:既可作为五阶低通滤波器使用(频率范围42kHz至900kHz),也可作为四阶高通...

    Oracle Spatial 和MapViewer 新特性

    - **SDO_GEOMETRY 中的三维数据表示**:Oracle Spatial 11g 支持使用 SDO_GEOMETRY 类型来表示三维数据,如点、线、简单表面、合成表面、简单实体以及合成实体等。 ##### 1.2 Web 服务增强 - **Web 地理特征服务 ...

    CANopen CiA 通讯手册

    - **处理映射错误**:列举了一些常见的映射错误及其解决方法,如地址冲突、数据长度不匹配等。 - **虚拟映射**:介绍了在某些情况下使用虚拟PDO作为占位符的概念,以保持网络通信的一致性和稳定性。 - **服务数据...

    S7-SCL 编程.zip_SCL

    - **编译与调试**:编译程序,检查语法错误和类型不匹配,通过调试工具进行测试。 - **下载与运行**:将编译好的程序下载到PLC中,监控运行状态,根据需要进行调整优化。 5. **学习资源** 《S7-SCL 编程.pdf》这...

    Oracle数据库完全入库过程[参照].pdf

    这里使用`MDSYS.SPATIAL_INDEX`索引类型创建了一个名为`jimaoshichangsuoyin`的索引。 第二部分**空间数据迁移**主要涉及数据的转移和表结构的调整: 1. **创建新表**: - 为了迁移数据,首先创建一个新的表`...

    CAN通讯的知识点.pdf

    CAN通讯是一种广泛应用于...总的来说,CAN通讯是工业自动化中不可或缺的一部分,而Vacon的CAN Open选件卡使得其NX变频器能够充分利用这一协议的优势,实现与其他CANOPEN设备的高效通信,提升了整个系统的性能和可靠性。

    ARCSDE与Oracle9iSpatial空间数据转换方法研究.pdf

    空间数据被存储为特殊的数据类型,如SDO_GEOMETRY。 由于数据存储格式的不同,直接在ARCSDE和Oracle9iSpatial之间进行数据转换会面临挑战。为了实现转换,我们需要遵循以下步骤: 1. 数据抽取:首先,从ARCSDE中...

    图论中间件技术学习:raster

    在文档中提及的Oracle的SDO_GEORASTER对象,是Oracle数据库中用于存储栅格数据的特殊数据类型。Oracle Georaster是一个地理空间数据模型,它能够高效地存储和分析栅格数据。它的主要特性包括但不限于以下几个方面: ...

    Oracle9i在GIS中的应用.pdf

    Oracle Spatial支持的对象-关系模型是符合OpenGIS ODBC/SQL空间几何特征规范的,允许在一个单一的MDSYS.SDO_GEOMETRY列中存储几何实体。这种模型有以下几个优点: 1. 支持多种几何类型,提高了数据的多样性。 2. ...

    基于Oracle9i Spatial空间数据库的设计与实现.pdf

    总结来说,Oracle9i Spatial空间数据库通过支持复杂空间数据类型的存储和管理,提供强大的空间索引和空间分析工具,极大地提升了空间数据处理的能力和效率。这对于地理信息系统(GIS)、城市规划、资源管理以及需要...

    M14火焰传感器电路图.pdf

    3. **SDI and SDO**:串行数据输入(SDI)和串行数据输出(SDO)是串行通信接口,允许微控制器与其他设备交换数据。 4. **5V电源**:提供电路所需的电源,确保各组件正常工作。 5. **J2CON5, J6/NC, J4火焰传感器,...

Global site tag (gtag.js) - Google Analytics