如何在olingo中创建复杂的类型集合

时间:2015-03-07 15:18:01

标签: odata olingo

我尝试按照下面的olingo文档创建一个odata服务。

AnnotationProcessor

但我无法使用其类型为ComplexType列表的属性创建实体。 任何人都有一个例子。或者只是不支持?

2 个答案:

答案 0 :(得分:2)

昨天我在项目中遇到了类似的要求。那是我注意到你的问题没有答案的时候。 我已经实施了一种适合我的方法。我在下面描述它。希望它会有所帮助。

简而言之:我是如何理解的,因为我们无法使用ComplexType将实体作为列表。我们需要使用导航属性。

问题陈述:我必须阅读一个实体 - EntityA。 EntityA与EntityB相关。关系是ONE-TO-MANY,即EntityA包含EntityB的列表。典型的JSON表示如下:

EntityA:{
"id":"entityA_1",
"entityBList":[
     {//EntityB Element
        "id" : "entityB_1",
        "description":"value1"
     },
     {//EntityB Element
        "id" : "entityB_2",
        "description":"value1"
     }
  ]
}

从客户端读取它我使用扩展的OData查询 - odata.sv/EntityA(1)?$ expand = EntityB

<强>解决方案: 要在服务器端启用上述方案,我必须使用导航属性。

  • 首先,我们创建两个独立的实体 - EntityA和EntityB。然后我们 通过

    定义关系
    1. 实施getAssociation方法和
    2. 在EdmProvider中设置导航属性,同时定义EntityA
  • 接下来,在阅读Entity(readEntity)时,我们提供回调
    覆盖&#39; retrieveFeedResult&#39;用于填充EntityB。

我为此工作了POC。如果需要,我也可以分享这个。现在我时间不够,所以只是分享了一个整体方法。 希望这会有所帮助。

答案 1 :(得分:2)

也许 Utsav的答案在那个时间点是正确的,但Odata v4确实支持具有类型为“ ComplexType列表”的属性的实体。
证明:this sample entityType 具有属性 AddressInfo ,其类型是ComplexType的集合:

getSchemas()

关于Olingo实现,在CSDL提供程序中,您必须正确定义复杂类型实体,然后定义要作为此复杂类型集合的属性。然后你必须正确处理结果。

1。在CSDL提供程序中定义元数据

在提供商的 List <CsdlComplexType> complexTypes = new ArrayList<>(); //...initialization of complexTypes list... schema.setComplexTypes(complexTypes); 方法中,您必须声明复杂类型:

getEntityType()

//...initialization of entityType... List<CsdlProperty> properties = new ArrayList<>(); FullQualifiedName type; //...initialization of the type as a complex type... properties.add(new CsdlProperty().setName("propertyName").setType(type).setCollection(true)); entityType.setProperties(properties); //... 方法中,您必须将属性创建为复杂类型对象的集合:

readEntityCollection()

2。处理结果

在处理器的实现中,您必须正确构建您的实体: 例如,在EntityCollectionProcessor实现的 EntityCollection entities = new EntityCollection(); List<Entity> eList = entities.getEntities(); Entity e = new Entity(); List<Map> data; //...initialization of complex type's data... List<ComplexValue> properties = new ArrayList<>(); for (Object complexObject : data) { ComplexValue complexValue = new ComplexValue(); for (Map.Entry<String, Object> entry : complexObject.entrySet()) { complexValue.getValue().add(new Property(null, entry.getKey(), ValueType.PRIMITIVE, entry.getValue())); } properties.add(complexValue); } e.addProperty(new Property(null, "propertyName", ValueType.COLLECTION_COMPLEX, properties);); eList.add(e); //...serialize and set the result to response 方法中,你应该有类似的东西:

func (mc MQTTClient) MessageHandler(client MQTT.Client, msg MQTT.Message) {
   fmt.Printf("TOPIC: %s\n", msg.Topic())
   fmt.Printf("MSG: %s\n", msg.Payload())
}

func (mc MQTTClient) AddMessageHandler(){
  //..
  //subscribe to the topic /go-mqtt/sample and request messages to be delivered
  //at a maximum qos of zero, wait for the receipt to confirm the subscription

  if token := c.Subscribe("go-mqtt/sample", 0, mc.MessageHandler); token.Wait() && token.Error() != nil {
                    fmt.Println(token.Error())
                    os.Exit(1)
  }
}