Неудовлетворительная зависимость от Panache и нескольких источников данных

Что я пытаюсь сделать

Я создаю приложение Vaadin с Quarkus, и при попытке подключить несколько источников данных возникла ошибка:

      2023-08-06 13:24:47,765 ERROR [io.qua.dep.dev.IsolatedDevModeMain] (main) Failed to start quarkus: java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
        [error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: jakarta.enterprise.inject.spi.DeploymentException: Found 3 deployment problems: 
[1] Unsatisfied dependency for type jakarta.persistence.EntityManagerFactory and qualifiers [@Default]
        - java member: io.quarkus.security.jpa.runtime.JpaTrustedIdentityProvider#entityManagerFactory
        - declared on CLASS bean [types=[io.quarkus.security.jpa.runtime.JpaTrustedIdentityProvider, io.quarkus.security.identity.IdentityProvider<io.quarkus.security.identity.request.TrustedAuthenticationRequest>, com.database.model.crm.CrmUser__JpaTrustedIdentityProviderImpl, java.lang.Object], qualifiers=[@Default, @Any], target=com.database.model.crm.CrmUser__JpaTrustedIdentityProviderImpl]
        The following beans match by type, but none have matching qualifiers:
                - Bean [class=org.hibernate.SessionFactory, qualifiers=[@Any, @io.quarkus.hibernate.orm.PersistenceUnit("default"), @Named("default")]]
                - Bean [class=org.hibernate.SessionFactory, qualifiers=[@Any, @Named("reservation"), @io.quarkus.hibernate.orm.PersistenceUnit("reservation")]]
[2] Unsatisfied dependency for type jakarta.persistence.EntityManagerFactory and qualifiers [@Default]
        - java member: io.quarkus.security.jpa.runtime.JpaIdentityProvider#entityManagerFactory
        - declared on CLASS bean [types=[io.quarkus.security.jpa.runtime.JpaIdentityProvider, io.quarkus.security.identity.IdentityProvider<io.quarkus.security.identity.request.UsernamePasswordAuthenticationRequest>, java.lang.Object, com.database.model.crm.CrmUser__JpaIdentityProviderImpl], qualifiers=[@Default, @Any], target=com.database.model.crm.CrmUser__JpaIdentityProviderImpl]
        The following beans match by type, but none have matching qualifiers:
                - Bean [class=org.hibernate.SessionFactory, qualifiers=[@Any, @io.quarkus.hibernate.orm.PersistenceUnit("default"), @Named("default")]]
                - Bean [class=org.hibernate.SessionFactory, qualifiers=[@Any, @Named("reservation"), @io.quarkus.hibernate.orm.PersistenceUnit("reservation")]]
[3] Unsatisfied dependency for type io.quarkus.security.identity.AuthenticationRequestContext and qualifiers [@Default]
        - java member: com.ui.configuration.UserAugmentor#augment():context
        - declared on PRODUCER METHOD bean [types=[java.lang.Object, io.smallrye.mutiny.Uni<io.quarkus.security.identity.SecurityIdentity>], qualifiers=[@Any, @PersistenceUnitExtension], target=io.smallrye.mutiny.Uni<io.quarkus.security.identity.SecurityIdentity> augment(io.quarkus.security.identity.SecurityIdentity identity, io.quarkus.security.identity.AuthenticationRequestContext context), declaringBean=com.ui.configuration.UserAugmentor]

Моя конфигурация источников данных выглядит следующим образом:

      quarkus.datasource.default... # Default datasource config
quarkus.datasource.reservation... # Reservation datasource config

quarkus.hibernate-orm.default.datasource=default # Orm Default mapping
quarkus.hibernate-orm.reservation.datasource=reservation # Orm reservation mapping

И мои объекты правильно связаны с источником данных:

      @PersistenceUnit("default")
package com.database.model.crm;

import io.quarkus.hibernate.orm.PersistenceUnit;

и

      @PersistenceUnit("reservation")
package com.database.model.reservation;

import io.quarkus.hibernate.orm.PersistenceUnit;

Я уже попробовал несколько вещей:

Сначала я попробовал добавить соответствующую аннотацию в свойUserAugmentorотвечает за предоставление удостоверений безопасности внутри моего приложения:

      @PersistenceUnitExtension
@RequestScoped
public class UserAugmentor implements SecurityIdentityAugmentor {
...
}

Затем, используя шаблон Active Record, я попытался переключиться на шаблон репозитория, чтобы добавить@PersistenceUnitExtensionво внедренном репозитории:

      @Inject
@PersistenceUnitExtension
CrmUserRepository crmUserRepository;

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

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

Спасибо за чтение.

Редактировать 1

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

      public abstract class JpaIdentityProvider implements IdentityProvider<UsernamePasswordAuthenticationRequest> {

    private static Logger log = Logger.getLogger(JpaIdentityProvider.class);

    @Inject
    EntityManagerFactory entityManagerFactory; // I think this one is the origin

    public JpaIdentityProvider() {}
...

Как вы думаете, это может быть ошибка?

Редактировать 2

Предыдущая ошибка исчезла, но предложенная конфигурация пока не работает. я просто не могу комментироватьpackage-info.javaс без значения.

Это дает мне'value' missing though required. Я также пробовал использовать@PersistenceUnit("<default>")как значение по умолчанию, указанное в аннотации.

Это дало мне следующую ошибку:


Даже при правильной настройке источника данных по умолчанию:

      quarkus.datasource... # Default datasource config
quarkus.datasource.reservation... # Reservation datasource config

quarkus.hibernate-orm.reservation.datasource=reservation # Orm reservation mapping

Редактировать 3

Следующая ошибка произошла из-за плохой конфигурации:

      Model classes are defined for the default persistence unit <default> but configured datasource <default> not found: the default EntityManagerFactory will not be created. To solve this, configure the default datasource. Refer to https://quarkus.io/guides/datasource for guidance.

Но я все еще не могу установить@PersistenceUnitбез ценности.

1 ответ

Что касается Quarkus, в вашей конфигурации нет единицы сохранения/источника данных по умолчанию. Существует только именованный источник данных, который имеет имяdefault. У единицы персистентности/источника данных по умолчанию нет имени.

Вы должны использовать эту конфигурацию:

      quarkus.datasource... # Default datasource config
quarkus.datasource.reservation... # Reservation datasource config

# The default Persistence Unit will use the default datasource (no config needed)

quarkus.hibernate-orm.reservation.datasource=reservation # Orm reservation mapping

То же самое и с аннотациями: не следует использовать имя «по умолчанию»:

      @PersistenceUnit // Note this is @io.quarkus.hibernate.orm.PersistenceUnit, not @jakarta.persistence.PersistenceUnit
package com.database.model.crm;

import io.quarkus.hibernate.orm.PersistenceUnit;

Что касается того, почемуquarkus-security-jpaработает только с PU по умолчанию... кажется, поддержка именованного источника данных просто еще не реализована. Я открыл https://github.com/quarkusio/quarkus/issues/35231 , чтобы решить эту проблему. Тем временем конфигурация, которую я дал выше, должна работать.

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