Как выполнить расчет объекта в GET/find на Spring Data Rest?

Я использую средство @RepositoryRestResource, но я хотел бы выполнять вычисления (в зависимости от внешней службы) над временным полем каждый раз, когда пользователь выполняет операцию чтения GET, поиск и т. д..

Если бы в списке было событие AfterGet/AfterFind, я мог бы обработать модификацию, расширив AbstractRepositoryEventListener

Любое чистое предложение?

как насчет использования АОП?

Akshay Khopkar 16.07.2019 23:35

Возможное решение — слушатель сущностей @PostLoad. Традиционно было немного взломано, чтобы сделать прослушиватель сущностей пружинным, однако здесь есть ответ, предполагающий, что теперь это просто в последних версиях Spring/Hibernate. Если нет, то существуют другие решения. stackoverflow.com/a/55452014/1356423

Alan Hay 17.07.2019 09:13

Спасибо! Но мне нужно вызвать внешнюю службу, я не уверен, что имеет смысл вводить зависимость ни в объект для @PostLoad, ни в EntityListener без сохранения состояния

Whimusical 17.07.2019 16:50
Я не уверен, что имеет смысл вводить зависимость в сущность для @PostLoad ни в слушателе сущности без состояния. Простите, а что это значит? Логика будет обрабатываться прослушивателем сущностей, внешним по отношению к вашей сущности, а не с помощью метода обратного вызова, определенного внутри него, например. thejavageek.com/2014/05/24/jpa-entitylisteners
Alan Hay 17.07.2019 17:00

Мой расчет основан на внешнем вызове, куда мне его поместить, если сущности и EntityListeners должны быть без гражданства?

Whimusical 17.07.2019 17:02

Что вы подразумеваете под лицом без гражданства в этом контексте?

Alan Hay 17.07.2019 17:03
An entity listener is a stateless class with a no-arg constructor. An entity listener is defined by annotating the entity class with the @EntityListeners annotationdocs.jboss.org/hibernate/entitymanager/3.6/referen‌​ce/en/html/…
Whimusical 17.07.2019 17:13

Я думаю, что выразил это нехорошими словами. Код, который выполняет вызов, находится во внешней зависимости, я должен найти способ внедрить его в EntityListener, но это не разрешено

Whimusical 17.07.2019 17:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
8
176
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел способ благодаря предложению @Alan Hay.

@Entity
@EntityListeners(TransientFieldResolver.class)
public class Entity {

    private Long id;
    private String transientField;
}

@Component
public static class TransientFieldResolver {

    private static ExternalService externalService;

    @Autowired
    public void setExternalService(ExternalService externalService) {
        TransientFieldResolver.externalService = externalService;
    }

    @PostLoad
    public void onPostLoad(final Entity entity) {
        if (Objects.isNull(entity.getTransientField())) {
            TransientFieldResolver.externalService.fillTransientField(entity);
        }
    }
}

По иронии судьбы у меня есть проект, в котором принимаются внедренные объекты без конструктора без аргументов, но он не соответствует всем проектам... или либо недавно разрешенная функция

Whimusical 19.11.2019 12:18

Другие вопросы по теме