Вызовите @Autowired репозиторий из статического контекста

85
13

У меня есть метод createEntity, который является статическим, потому что мне нужно вызвать его из других объектов, внутри этого метода мне нужно вызвать репозиторий, но логически я не могу это сделать, потому что он не статичен.

public static Client createEntity(EntityManager em) {
default_operation = operationRepository.save(OperationResource.createEntity(em));
}

Я бы не спросил, не у меня ли эта голова не сдулась, я попытался использовать @Autowired конструкторы в качестве другого предлагаемого решения, но это не будет работать для репозитория.

Если у кого-нибудь есть идея или обходной путь, я был бы признателен!

спросил(а) 2018-02-08T20:39:00+03:00 2 года, 10 месяцев назад
1
Решение
82

Использование статических методов вызывает проблемы (не только весной). Одна из причин заключается в том, что автоувеличиваемые свойства класса недоступны в статическом контексте. Они вводятся только на определенных этапах весеннего жизненного цикла.

Вы должны объявить класс, содержащий метод createEntity как компонент Spring (например, с @Component). Затем вы можете ввести этот компонент (с помощью @Autowired) во всех других классах, которые должны вызвать createEntity.

ответил(а) 2018-02-08T20:49:00+03:00 2 года, 10 месяцев назад
42

Я НЕ рекомендую это, но по какой-либо причине, если вы не можете изменить исходный класс (на одиночный), вы можете рассмотреть подход ниже, который вызывает createEntity(entityManager) внутри метода @PostConstruct:


public class MyRepository {

private EntityManager entityManager;

private static Client client;

@Autowired
public MyRepository(EntityManager entityManager) {
this.entityManager = entityManager;
}

@PostConstruct
public void init() {
//Now call your createEntity(entityManager) method
client = EntityUtils.createEntity(entityManager);
}

}

ответил(а) 2018-02-08T21:14:00+03:00 2 года, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема