ISIS:从弃用的@Action(invokeOn=...) 转移到@Action(associateWith=...)
ISIS: Moving from deprecated @Action(invokeOn=...) to @Action(associateWith=...)
我正在使用 ISIS 1.16.2 进行一个项目。我有一个名为 ConfigurationItem
的超类,它有一些共同的属性(name
、createdTimestamp
等)。
例如,它有一个删除操作方法,用 @Action(invokeOn = InvokeOn.OBJECT_AND_COLLECTION, ...)
注释,我需要从实体详细信息视图以及带有选择框的集合视图中调用它。
示例:
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' 的语义,因为我没有可供参考的集合字段。
相反,我只有 return 由数据库检索操作编辑的对象集合。
我的问题是: 如何将已弃用的 @Action(invokeOn=...)
语义转移到新的 @Action(associateWith="...")
集合概念 return 值支持 属性 字段?
提前致谢!
好问题,显然 Apache Isis 文档中对此解释得不够好。
@Action(invokeOn=InvokeOn.OBJECT_AND_COLLECTION)
一直有点麻烦,因为它涉及对独立集合调用操作(也就是说,对象列表 return 从先前的查询中编辑).我们不喜欢这样,因为没有 "single" 对象来调用操作。
当我们实现该功能时,对视图模型的支持远没有现在那么全面。因此,我们现在的建议是,与其 return 使用一个裸露的独立集合,不如将其包装在一个包含该集合的视图模型中。
然后,视图模型为我们提供了一个单一的目标来调用某些行为;这个想法是视图模型有责任遍历所有选定的项目并对它们调用操作。
使用您的代码,我们可以引入 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
操作更改为 return 此视图模型:
public class ConfigurationItems {
@Action(semantics = SemanticsOf.SAFE)
public SelectedItems listAll() {
List<T> items = repositoryService.allInstances(<item-subclass>.class);
return new SelectedItems(items);
}
}
现在您有了一个视图模型来表示输出,您可能会发现可以用它做的其他事情。
希望这是有道理的!
我正在使用 ISIS 1.16.2 进行一个项目。我有一个名为 ConfigurationItem
的超类,它有一些共同的属性(name
、createdTimestamp
等)。
例如,它有一个删除操作方法,用 @Action(invokeOn = InvokeOn.OBJECT_AND_COLLECTION, ...)
注释,我需要从实体详细信息视图以及带有选择框的集合视图中调用它。
示例:
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' 的语义,因为我没有可供参考的集合字段。
相反,我只有 return 由数据库检索操作编辑的对象集合。
我的问题是: 如何将已弃用的 @Action(invokeOn=...)
语义转移到新的 @Action(associateWith="...")
集合概念 return 值支持 属性 字段?
提前致谢!
好问题,显然 Apache Isis 文档中对此解释得不够好。
@Action(invokeOn=InvokeOn.OBJECT_AND_COLLECTION)
一直有点麻烦,因为它涉及对独立集合调用操作(也就是说,对象列表 return 从先前的查询中编辑).我们不喜欢这样,因为没有 "single" 对象来调用操作。
当我们实现该功能时,对视图模型的支持远没有现在那么全面。因此,我们现在的建议是,与其 return 使用一个裸露的独立集合,不如将其包装在一个包含该集合的视图模型中。
然后,视图模型为我们提供了一个单一的目标来调用某些行为;这个想法是视图模型有责任遍历所有选定的项目并对它们调用操作。
使用您的代码,我们可以引入 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
操作更改为 return 此视图模型:
public class ConfigurationItems {
@Action(semantics = SemanticsOf.SAFE)
public SelectedItems listAll() {
List<T> items = repositoryService.allInstances(<item-subclass>.class);
return new SelectedItems(items);
}
}
现在您有了一个视图模型来表示输出,您可能会发现可以用它做的其他事情。
希望这是有道理的!