ISIS:从已弃用的@Action(invokeOn = ...)移至@Action(associateWith = ...)

时间:2019-01-30 11:46:06

标签: java isis

我正在使用ISIS 1.16.2进行项目。我有一个名为ConfigurationItem的超类,它具有一些通用属性(namecreatedTimestamp等)。 例如,它具有一个用@Action(invokeOn = InvokeOn.OBJECT_AND_COLLECTION, ...)注释的delete操作方法,我需要从实体详细视图以及带有选择框的集合视图中调用该方法。

示例:

public class ConfigurationItem {

    @Action(
            invokeOn = InvokeOn.OBJECT_AND_COLLECTION,
            semantics = SemanticsOf.NON_IDEMPOTENT_ARE_YOU_SURE,
            domainEvent = DeletedDomainEvent.class)
    public Object delete() {
        repositoryService.remove(this);
        return null;
    }

    // ...
}

public class ConfigurationItems {

    @Action(semantics = SemanticsOf.SAFE)
    public List<T> listAll() {
        return repositoryService.allInstances(<item-subclass>.class);
    }

    // ...
}

这很好用,但是现在不建议使用“ invokeOn”注释。 JavaDoc说应该切换到@Action(associateWith="..."),但是我不知道如何传递'InvokeOn'的语义,因为我没有引用的集合字段。 相反,我只有数据库检索操作返回的对象集合。

我的问题是:我如何将已弃用的@Action(invokeOn=...)语义转换为新的@Action(associateWith="...")概念,以获取没有支持属性字段的集合返回值?

谢谢!

1 个答案:

答案 0 :(得分:1)

很好的问题,这显然在Apache Isis文档中解释得不够充分。

@Action(invokeOn=InvokeOn.OBJECT_AND_COLLECTION)一直有点麻烦,因为它涉及针对独立集合(即从上一个查询返回的对象列表)调用操作。我们不喜欢这样,因为没有“单个”对象可以调用操作。

当我们实现该功能时,对视图模型的支持远没有现在那么全面。因此,我们现在的建议是,与其返回一个裸露的独立集合,不如将其包装在一个保存该集合的视图模型中。

然后,视图模型为我们提供了一个目标来调用某些行为;这个想法是视图模型有责任遍历所有选定项并对其执行操作。

使用您的代码,我们可以引入SomeConfigItems作为视图模型:

@XmlRootElement("configItems")
public class SomeConfigItems {

    @lombok.Getter @lombok.Setter
    private List<ConfigurationItem> items = new ArrayList<>();

    @Action(
        associateWith = "items",  // associates with the items collection
        semantics = SemanticsOf.NON_IDEMPOTENT_ARE_YOU_SURE,
        domainEvent = DeletedDomainEvent.class)
    public SomeConfigItems delete(List<ConfigurationItem> items) {
        for(ConfigurationItem item: items) {
           repositoryService.remove(item);
        }
        return this;
    }
    // optionally, select all items for deletion by default
    public List<ConfigurationItem> default0Delete() { return getItems(); }

    // I don't *think* that a choices method is required, but if present then 
    // is the potential list of items for the argument
    //public List<ConfigurationItem> choices0Delete() { return getItems(); }
}

,然后更改ConfigurationItems操作以返回此视图模型:

public class ConfigurationItems {

    @Action(semantics = SemanticsOf.SAFE)
    public SelectedItems listAll() {
        List<T> items = repositoryService.allInstances(<item-subclass>.class);
        return new SelectedItems(items);
    }
}

现在您已经有了一个表示输出的视图模型,您可能会发现可以使用它的其他功能。

希望如此!