Почему Hybris modelService.save () не работает внутри метода ifPresent ()? - PullRequest
0 голосов
/ 29 апреля 2020
    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». Это отношения один ко многим. Как вы можете видеть, я провел некоторую фильтрацию, и в конце я хочу обновить значение атрибута 'someNumber' для 'Foo', если оно равно null. Я подтвердил, что все работает, так как значение атрибута "someNumber" обновляется во время отладки. Это совсем не спасает, так как я сделал свою проверку в HM C. Я также подтвердил, что у Interceptor нет условий, которые могли бы вызвать ошибку. В журнале тоже ничего не отображается.

Мне интересно, является ли законным подход к использованию метода "modelService.save ()" внутри метода ifPresent ()? В чем здесь может быть проблема?

1 Ответ

0 голосов
/ 07 мая 2020

Вы должны быть осторожны со списком в моделях, поскольку они неизменны, вы должны установить весь новый список. Также вы вызвали сохранение только для конкретной модели, которая меняет свою ссылку на 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());
}
...