答案 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。然后我们 通过
定义关系我为此工作了POC。如果需要,我也可以分享这个。现在我时间不够,所以只是分享了一个整体方法。 希望这会有所帮助。
答案 1 :(得分:2)
也许 Utsav的答案在那个时间点是正确的,但Odata v4确实支持具有类型为“ ComplexType列表”的属性的实体。
的证明:强>
在this sample entityType 人具有属性 AddressInfo ,其类型是ComplexType的集合:
getSchemas()
关于Olingo实现,在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()
在处理器的实现中,您必须正确构建您的实体:
例如,在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)
}
}