如何在 Apache Olingo V4 中使用字符串枚举 Java API
How to use String enumerations with Apache Olingo V4 Java API
我只是不知道如何在数据创建过程中使用 Apaches Olingo V4 CsdlEnumType
Java API。
这是我到目前为止用尽可能少的代码所做的:
1) 在我的 EdmODataProvider.java
class 中,我创建了一个实体类型并将枚举实体的 FQDN
添加到属性中。此外,我在架构提供程序 class 中实例化了 CsdlEnumType
。我想这行得通,因为如果我在 setValue()
部分只使用数字,我会得到预期的结果。 :
public CsdlEntityType getEntityType(FullQualifiedName entityTypeName) throws ODataException {
CsdlEntityType entityType = new CsdlEntityType();
List<CsdlProperty> properties = new ArrayList<CsdlProperty>();
properties.add(new CsdlProperty().setName("Attributes").setType(new FullQualifiedName("Namespace", "Attributes")));
entityType.setName("Langs").setProperties(properties);
return entityType;
}
public List<CsdlSchema> getSchemas() throws ODataException {
CsdlSchema schema = new CsdlSchema();
schema.setNamespace("Namespace");
List<CsdlEnumType> enumTypes = new ArrayList<CsdlEnumType>();
enumTypes.add(
new CsdlEnumType()
.setName("LangAttributes")
.setMembers(Arrays.asList(
// if I use setValue("0") ... setValue("1") everything works fine
new CsdlEnumMember().setName("DISPNAME").setValue("DISPNAME"),
new CsdlEnumMember().setName("DESC").setValue("DESC")
))
)
// ... add entity type and set the other stuff
}
2) 在我的数据提供程序中 class 我正在创建这样的实体:
Entity e = new Entity();
// again: it would work if I would use 0 instead of "DISPNAME" here
e.addProperty(new Property(null, "LangAttributes", ValueType.Enum, "DISPNAME"));
如果我尝试调用实体,我最终会收到错误消息:
<error xmlns="http://docs.oasis-open.org/odata/ns/metadata">
<code>400</code>
<message>The value 'DISPNAME' is not valid for property 'LangAttributes'.</message>
</error>
我的 $metadata
包含:
<EnumType Name="Attribute" IsFlags="false" UnderlyingType="Edm.Int32">
<Member Name="DISPNAME" Value="DISPNAME"/>
<Member Name="DESC" Value="DESC"/>
</EnumType>
....
<EntityType Name="Attributes">
<Property Name="LangAttributes" Type="Namespace.Attribute"/>
</EntityType>
我猜问题出在第 2 部分)中,我将属性 DISPNAME
添加为字符串。知道如何解决这个问题吗?
不知道您是否还面临这个问题。但也许我的回答对某人有用。根据 OASIS OData Documentation:
Enumeration types are named primitive types whose values are named constants with underlying integer values.
您不能简单地在 Olingo 中创建枚举,它具有 String 基础类型。我的建议是跳过代码中的 .setValue("")
部分并依赖默认值(0、1、2 等)。不要害怕 - 您可以通过提供名称或值来对请求中的枚举值进行操作。所以就靠名字.
并且在代码中您可以使用 EdmEnumType
中的 valueOfString(name, null, null, null, null, null, Long)
方法。
我只是不知道如何在数据创建过程中使用 Apaches Olingo V4 CsdlEnumType
Java API。
这是我到目前为止用尽可能少的代码所做的:
1) 在我的 EdmODataProvider.java
class 中,我创建了一个实体类型并将枚举实体的 FQDN
添加到属性中。此外,我在架构提供程序 class 中实例化了 CsdlEnumType
。我想这行得通,因为如果我在 setValue()
部分只使用数字,我会得到预期的结果。 :
public CsdlEntityType getEntityType(FullQualifiedName entityTypeName) throws ODataException {
CsdlEntityType entityType = new CsdlEntityType();
List<CsdlProperty> properties = new ArrayList<CsdlProperty>();
properties.add(new CsdlProperty().setName("Attributes").setType(new FullQualifiedName("Namespace", "Attributes")));
entityType.setName("Langs").setProperties(properties);
return entityType;
}
public List<CsdlSchema> getSchemas() throws ODataException {
CsdlSchema schema = new CsdlSchema();
schema.setNamespace("Namespace");
List<CsdlEnumType> enumTypes = new ArrayList<CsdlEnumType>();
enumTypes.add(
new CsdlEnumType()
.setName("LangAttributes")
.setMembers(Arrays.asList(
// if I use setValue("0") ... setValue("1") everything works fine
new CsdlEnumMember().setName("DISPNAME").setValue("DISPNAME"),
new CsdlEnumMember().setName("DESC").setValue("DESC")
))
)
// ... add entity type and set the other stuff
}
2) 在我的数据提供程序中 class 我正在创建这样的实体:
Entity e = new Entity();
// again: it would work if I would use 0 instead of "DISPNAME" here
e.addProperty(new Property(null, "LangAttributes", ValueType.Enum, "DISPNAME"));
如果我尝试调用实体,我最终会收到错误消息:
<error xmlns="http://docs.oasis-open.org/odata/ns/metadata">
<code>400</code>
<message>The value 'DISPNAME' is not valid for property 'LangAttributes'.</message>
</error>
我的 $metadata
包含:
<EnumType Name="Attribute" IsFlags="false" UnderlyingType="Edm.Int32">
<Member Name="DISPNAME" Value="DISPNAME"/>
<Member Name="DESC" Value="DESC"/>
</EnumType>
....
<EntityType Name="Attributes">
<Property Name="LangAttributes" Type="Namespace.Attribute"/>
</EntityType>
我猜问题出在第 2 部分)中,我将属性 DISPNAME
添加为字符串。知道如何解决这个问题吗?
不知道您是否还面临这个问题。但也许我的回答对某人有用。根据 OASIS OData Documentation:
Enumeration types are named primitive types whose values are named constants with underlying integer values.
您不能简单地在 Olingo 中创建枚举,它具有 String 基础类型。我的建议是跳过代码中的 .setValue("")
部分并依赖默认值(0、1、2 等)。不要害怕 - 您可以通过提供名称或值来对请求中的枚举值进行操作。所以就靠名字.
并且在代码中您可以使用 EdmEnumType
中的 valueOfString(name, null, null, null, null, null, Long)
方法。