java - 如何在 Olingo OData V4 java API 中创建枚举实体类型

标签 java enums odata olingo

我创建了一个枚举:

public enum ROLECATEGORY {
    LOW ("Low Risk", 0),
    MEDIUM ("Medium Risk", 1),

    public final String attrname;
    public final int value;

    ROLECATEGORY(String attrname, int value) {
        this.attrname = attrname;
        this.value = value;
    }
    public static ROLECATEGORY valueOf(int val){
        switch(val){
        case 0: return LOW; 
        case 1: return MEDIUM;
        default: throw new IllegalArgumentException("blablabla");
        }
    }
    public int toInt() { return value; }
}

根据初学者教程,我创建了普通的 ODataProvider 类。我所缺少的只是一段代码,可以将枚举作为属性实例化的 FQDN 类型获取:

CsdlProperty p = new CsdlProperty().setName("MYENUM").setType( ?getEnumType("MYENUM")? )

最佳答案

好的,我自己找到了一个简单的解决方案。但这可能不是最好的:

1.) 我添加了一个新的静态 FullQualifiedName:

public static final FullQualifiedName CET_ROLECAT = new FullQualifiedName(NAMESPACE, "RoleCategory");

2.) 我创建了成员 getEnumType()

public CsdlEnumType getEnumType(final FullQualifiedName enmuTypeName){
    if (CET_ROLECAT.equals(enmuTypeName)) {
        return new CsdlEnumType()
            .setName(CET_ROLECAT.getName())
            .setMembers(Arrays.asList(
                    new CsdlEnumMember().setName("LOW").setValue("0"),
                    new CsdlEnumMember().setName("MEDIUM").setValue("1")
            ))
            .setUnderlyingType(EdmPrimitiveTypeKind.Int32.getFullQualifiedName())
        ;
    }
    return null;
}

3.) 我已将 1.) 中的 FQDN 添加到我的实体属性中:

// ...    
CsdlProperty p = new CsdlProperty().setName("RoleCategory").setType(CET_ROLECAT));
//...

4.) 最后我在我的架构中添加了 EnumType:

public List<CsdlSchema> getSchemas() throws ODataException {
    CsdlSchema schema = new CsdlSchema();
    // ...
    List<CsdlEnumType> enumTypes = new ArrayList<CsdlEnumType>();
    enumTypes.add(getEnumType(CET_ROLECAT));
    schema.setEnumTypes(enumTypes);
    // ...
    List<CsdlSchema> schemas = new ArrayList<CsdlSchema>();
    schemas.add(schema);
    return schemas;
}

仅供引用:'NAMESPACE' 只是我的 EdmODataProvider 类中的公共(public)静态最终字符串成员。

不幸的是,我只能在 CsdlEnumMember 的 2.) 中的名称和值部分添加字符串。我也不确定 setUnderlyningType() 的用途。

关于java - 如何在 Olingo OData V4 java API 中创建枚举实体类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36056649/

相关文章:

java - 如何解析这个日期格式

ios - 枚举类型的开关大小写

具有多个命名空间的 ODataConventionModelBuilder

java - 并发访问 ExecutorService

java - 在java中从客户端向服务器发送字符串时出现问题

java - 在多个文本文件中查找常用词

java - 在 Java 中打开枚举不会转到正确的大小写

c++ - 构造临时对象时出错,该对象的构造函数采用单个枚举参数

c# - 卡住 linq IQueryable(就像 ToList().AsQueryable() 会做的那样)

rest - odata 过滤器中是否有 LIKE 运算符?