为什么 Hybris modelService.save() 在 ifPresent() 方法中不起作用?


private void doSomething(someProcessModel process){
CustomerModel customer = process.getCustomerModel();
customer.getFoos().stream()
.filter(foo -> foo.getCountryCode().equals(process.getCountryCode()))
.findFirst()
.ifPresent(foo -> {
if(foo.getSomeNumber() == null){
foo.setSomeNumber("1234567");
modelService.save(foo);
}
});
}

如上面的代码片段所示,我有一个"CustomerModel",它有一个属性"Foos"。这是一种一对多的关系。正如你所看到的,我已经做了一些过滤,最后,如果"Foo"的"someNumber"属性为null,我想更新它的值。我已经确认,当"someNumber"属性的值在调试期间更新时,一切都在工作。它根本不会保存,因为我已经在HMC中进行了检查。我还验证了拦截器没有任何会引发错误的条件。日志中也没有显示任何内容。

我想知道在"ifPresent(("方法中执行"modelService.save(("是否合法?这里可能存在什么问题?

我现在已经找到了根本原因,因为我再次面临同样的问题。

我最初问题的背景

为了给我最初的问题提供更多的上下文,#doSomething方法位于Hybris Business Process操作类中,一旦#doSomehing方法运行,我在调试它时(通过停止调试(提前结束了该操作。

根本原因

上面提到的问题发生在我调试操作类的时候。我假设ModelService#保存将在运行后保持业务流程的当前状态。但是,如果出现任何错误,Hybris OOTB业务流程将执行回滚(我相信这是由于我中途停止调试造成的(。

SAP商务文档:

所有操作都在自己的事务中执行。这意味着在操作bean运行方法内部所做的更改将在出现错误时回滚。

解决方案

让动作完全展开!

很高兴知道

根据SAP文档和这篇博客文章,有时我们需要绕过业务流程回滚,即使出现异常,也有实现这一点的方法。更多信息可以在本SAP Commerce文档和上述博客文章中找到。

但是,在某些情况下,可能需要让业务异常到达外部,但也需要提交事务并在外部处理异常。因此,可以使任务引擎不回滚在失败的任务期间所做的更改。

您必须小心处理模型中的列表,因为它们是不可变的,您必须设置整个新列表。此外,您只在特定模型上调用了save,这会更改其Jalo引用,这就是为什么您的列表不会更新的原因。修改流并最终收集它将创建新的列表,这就是为什么您可以直接从模型流式传输列表的原因。

private void doSomething(someProcessModel process){
CustomerModel customer = process.getCustomerModel();
ArrayList<FooModel> foos = doSomethingOnFoos(customer.getFoos());
customer.setFoos(foos);
modelService.saveAll(foos, customer);
}
//compare the value you know exists with something that might be NULL as equals can handle that, but not the other way around
private ArrayList<FooModel> doSomethingOnFoos(ArrayList<FooModel> fooList) {
return fooList.stream()
.filter(Objects::nonNull)
.filter(foo -> process.getCountryCode().equals(foo.getCountryCode()))
.filter(foo -> Objects.isNull(foo.getSomeNumber()))
.map(foo -> foo.setSomeNumber(1234))
.collect(toList());
}

相关内容

最新更新