Я хочу использовать его для управления данными из репозитория с помощью службы каталога, но аннотация 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;
}
Чего ты хочешь добиться?
Какая у вас конфигурация пружины? Конфигурация Java, xml, свойства? Вы используете автоматическую настройку весенней загрузки?




Я пробовал, просто следуйте приведенному ниже фрагменту кода.
@Component
public class DeptItemTransferBean {
@Autowired
private CatalogRepository catalogRepository;
public void save(OrderItem orderItem) {
catalogRepository.save(orderItem);
моя проблема в классе PostEntityListener, где я хочу ввести CatalogService, но он всегда инициализируется с помощью null.
Я решил эту проблему с помощью установщика-инъекции. Я использовал следующий код для внедрения зависимости:
@Autowired
public void setCatalogService(CatalogService catalogService) {
this.catalogService = catalogService;
}
Это называется инъекцией методом сеттера. Этот init(..) на самом деле является setCatalogService(...). Было бы менее запутанно, если бы вы переименовали этот метод.
конечно - @Viacheslav Shalamov
Прежде всего, имейте в виду, что, согласно Спецификация 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 выглядит легко адаптируемым к вашему коду.
Пожалуйста, предоставьте дополнительную информацию. Как выглядит CatalogService, какая у вас @Configuration, что такое сканирование компонентов и т. д.