Неудовлетворительная зависимость от 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 , чтобы решить эту проблему. Тем временем конфигурация, которую я дал выше, должна работать.