Ошибка при использовании Spring Data JPA, смешанного с EntityManager в других классах: недоступен bean-компонент с именемactionManager - PullRequest
0 голосов
/ 15 октября 2018

Я работал над новым проектом с нуля, я просто использую JpaRepository и никакие дополнительные @Bean, @Qualifier(value = "xxx") или @Configuration не используются, благодаря Spring Data JPA.

Теперь я начинаю добавлять код в старый проект и вижу классы, использующие EntityManager и @Transactional и типизированные запросы.Я думаю, что они не нужны.

Поэтому я хочу добавить свой новый стиль хранилища, сохраняя старый код без изменений, но в этом классе и его тесте я вижу ошибки:

org.springframework.beans.factory.NoSuchBeanDefinitionException: нет доступного компонента с именем «actionManager »: не найдено ни одного соответствующего компонента PlatformTransactionManager для квалификатораactionManager - ни совпадения ни с квалификатором, ни с именем компонента!

Репозиторий: 1017*

public interface UserPurchaseRepository extends JpaRepository<UserPurchase, Long> {
    /**
     * Find the last purchase time of a user.
     * @param userId the id of user to search
     * @return the last buy time
     */
    OffsetDateTime findLastBuyDateByUserId(String userId);

}

Тест:

@RunWith(SpringRunner.class)
@AutoConfigureTestDatabase
@SpringBootTest
public class UserPurchaseServiceIntegrationTest {
    private static final String id = UUID.randomUUID().toString();
    private static final String userId = UUID.randomUUID().toString();
    private static final OffsetDateTime lastBuyDate = OffsetDateTime.now();

    @Autowired
    private UserPurchaseRepository repository;


    @Before
    public void setUp() {
        UserPurchase purchase = new UserPurchase();
        purchase.setId(id);
        purchase.setUserId(userId);
        purchase.setLastBuyDate(lastBuyDate);
        repository.save(purchase);
    }

    @After
    public void cleanUp() {
        repository.deleteAll();
    }

    @Test
    public void testFindLastBuyTimeByUserId() {
        // given (setUp())

        // when
        OffsetDateTime foundLastBuyTime = repository.findLastBuyDateByUserId(userId);

        // then
        Assert.assertEquals(lastBuyDate, foundLastBuyTime);
    }


}

Обратите внимание, что здесь @Transactional не требуется, поскольку это операция find.save или delete будут реализованы Spring.Итак, я думаю, что управление транзакциями здесь не нужно.

Нужно ли добавлять класс конфигурации, чтобы указать моему хранилищу использовать диспетчер транзакций?Есть ли способы избежать другого класса?Почему он не может просто работать, пока не работает в другом проекте?

PS: я видел, что compile("org.springframework.boot:spring-boot-starter-data-redis") и compile("org.springframework.boot:spring-boot-starter-data-jpa") оба перечислены в build.gradle.Это актуально?

1 Ответ

0 голосов
/ 16 октября 2018

Ну, я нашел почему: мы используем библиотеку для OpenID с именем mitre, и эта зависимость использует EclipseLink в качестве реализации JPA вместо Hibernate, поэтому нам пришлось исключить hibernate в spring-data-jpa.Если мы хотим использовать JPA-Hibernate, эти два будут смешиваться, и @Autowired будет легко путать, какой из них использовать, поэтому нам пришлось писать типизированные запросы только для использования этой библиотеки.Вот почему так сейчас.Кажется, я должен написать все запросы сам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...