Хороший вопрос, это, очевидно, недостаточно хорошо объяснено в документации 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);
}
}
Теперь, когда у вас есть модель представления для представления выходных данных, вы, вероятно, найдете другие вещи, которые можно сделатьс ним.
Надеюсь, что это имеет смысл!