Аннотации Autowired не работают с @PostLoad

Я хочу использовать его для управления данными из репозитория с помощью службы каталога, но аннотация Autowired не вводит зависимости.

@Service
public class PostEntityListener {
 @PostLoad
 public <T> void onPrePersist(T obj) {
    if (obj != null) {
        String type = obj.getClass().getSimpleName();
        switch (type) {
        case "Order":
            break;
        case "OrderItem":
            try {
                OrderItem orderItem = (OrderItem) obj;
                if (orderItem != null) {
                    catalogService.save(orderItem);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            break;
        default:
            break;
        }
    }
 }
 @Autowired
 private CatalogService catalogService;

}

Вот мои подробности о CatalogService:

public interface CatalogService {

   void save(OrderItem orderItem);

}

@Service
public class CatalogServiceImpl implements CatalogService {

   public void save(OrderItem orderItem) {
      catalogRepository.save(orderItem);
   }

   @Autowired
   private CatalogRepository catalogRepository;
}

Пожалуйста, предоставьте дополнительную информацию. Как выглядит CatalogService, какая у вас @Configuration, что такое сканирование компонентов и т. д.

Viacheslav Shalamov 10.05.2018 08:48

Чего ты хочешь добиться?

Mạnh Quyết Nguyễn 10.05.2018 08:48

Какая у вас конфигурация пружины? Конфигурация Java, xml, свойства? Вы используете автоматическую настройку весенней загрузки?

Viacheslav Shalamov 10.05.2018 09:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
3
659
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я пробовал, просто следуйте приведенному ниже фрагменту кода.

@Component
public class DeptItemTransferBean {

    @Autowired
    private CatalogRepository catalogRepository;

   public void save(OrderItem orderItem) {
     catalogRepository.save(orderItem);

моя проблема в классе PostEntityListener, где я хочу ввести CatalogService, но он всегда инициализируется с помощью null.

Devratna 10.05.2018 11:35

Я решил эту проблему с помощью установщика-инъекции. Я использовал следующий код для внедрения зависимости:

@Autowired
public void setCatalogService(CatalogService catalogService) {
    this.catalogService = catalogService;
}

Это называется инъекцией методом сеттера. Этот init(..) на самом деле является setCatalogService(...). Было бы менее запутанно, если бы вы переименовали этот метод.

Viacheslav Shalamov 10.05.2018 19:26

конечно - @Viacheslav Shalamov

Devratna 20.05.2018 13:05
Ответ принят как подходящий

Прежде всего, имейте в виду, что, согласно Спецификация JPA, вы не должны связываться (прямо или косвенно) с тем же контекстом постоянства, который вызывает ваш метод жизненного цикла:

In general, the lifecycle method of a portable application should not invoke EntityManager or query operations, access other entity instances, or modify relationships within the same persistence context [46] . [47] A lifecycle callback method may modify the non-relationship state of the entity on which it is invoked.

Так что ваш звонок catalogService.save(orderItem); выглядит подозрительно.

Что касается вашего основного вопроса, проблема в том, что экземпляры EntityListener создаются поставщиком JPA, а не Spring, поэтому вы не можете напрямую использовать в них полезности Spring. Вы можете реализовать некоторые обходные пути, однако, прочтите этот вопрос для более подробной информации, особенно ответ Den B выглядит легко адаптируемым к вашему коду.

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