如何在Olingo V4中创建一个有界动作(java)

时间:2016-08-03 06:38:34

标签: java odata olingo

我尝试过无处不在,但无法弄清楚如何在olingo V4 java中实现有界动作。

到处都是无限制的动作教程。

我尝试调整此代码。

  final CsdlAction action = new CsdlAction();
  action.setName("testAction");
  action.setBound(true);

当我尝试访问$ metadata API时,这会给我带来错误。

如果有人能指出我如何去做一个很好的教程,那就太棒了。

1 个答案:

答案 0 :(得分:2)

我查看了olingo的源代码并调试了他们的代码。经过大量的研究工作,我能够在Olingo中实施有限的行动。

假设我们想要实现一个有界动作,该动作与实体类型X绑定并返回实体Y.

需要做出的改变是:

元数据文档: 在扩展CsdlAbstractEdmProvider或实现CsdlEdmProvider的java类(自定义类)中,

实现getActions(...)函数

// Action Names
public static final String ACTION_EXECUTE_NAME = "Execute";

// FullyQualified Action Names
public static final FullQualifiedName ACTION_EXECUTE_FQN = new FullQualifiedName("StackOverflow", ACTION_EXECUTE_NAME);

@Override
public List<CsdlAction> getActions(FullQualifiedName actionName) throws ODataException {
    if (actionName.equals(ACTION_EXECUTE_FQN)) {
        // It is allowed to overload actions, so we have to provide a list
        // of Actions for each action name
        final List<CsdlAction> actions = new ArrayList<CsdlAction>();

        // Create the Csdl Action
        final CsdlAction action = new CsdlAction();
        action.setName(ACTION_EXECUTE_FQN.getName());
        action.setBound(true);

        // Creating Parameter the first one being binding parameter
        final List<CsdlParameter> parameters = new ArrayList<CsdlParameter>();
        final CsdlParameter parameter = new CsdlParameter();
        parameter.setName("Parameter1");
        parameter.setType(X);
        parameter.setNullable(true);
        parameter.setCollection(false);
        parameters.add(parameter);
        action.setParameters(parameters);

        action.setReturnType(new CsdlReturnType().setCollection(false).setType(Y));

        actions.add(action);
        return actions;
    }
    return null;
}

并且在相同元数据提供程序类的getSchemas(...)中使用getActions(...)方法。

@Override
public List<CsdlSchema> getSchemas() throws ODataException {
    // create Schema
    CsdlSchema schema = new CsdlSchema();
    schema.setNamespace("Stackoverflow");

    // add EntityTypes
    List<CsdlEntityType> entityTypes = new ArrayList<CsdlEntityType>();
    entityTypes.add(getEntityType(X));
    entityTypes.add(getEntityType(Y));

    schema.setEntityTypes(entityTypes);

    // add EntityContainer
    schema.setEntityContainer(getEntityContainer());

    // add bounded actions
    List<CsdlAction> actions = new ArrayList<CsdlAction>();
    schema.setActions(actions);
    actions.addAll(getActions(ACTION_EXECUTE_FQN));

    List<CsdlSchema> schemas = new ArrayList<CsdlSchema>();
    schemas.add(schema);
    return schemas;
}

我们所做的是,创建了一个名为ACTION_EXECUTE_FQN的有界动作,其中参数作为动作的第一个参数,在我们的例子中是实体X,返回类型是实体Y.

服务实施: 现在,还需要服务实施。根据已经使用的用例,我们需要创建一个实现 ActionEntityProcessor 的类。

在此之后,一切都是一样的。我希望这将有所帮助。还有其他ActionProcessor,具体取决于操作的返回类型以及操作受限的参数类型。