使用基于 PanacheMongoRepository 的存储库的 Quarkus 扩展

Quarkus extension using a repository based on PanacheMongoRepository

我目前正在开发 Quarkus 扩展,它基本上是一个使用 PanacheMongoRepository 的过滤器。这是一个代码片段(这是在扩展的运行时部分):

@Provider
@Priority(Priorities.AUTHORIZATION)
@AuthorizationSecured
public class AuthorizationFilter implements ContainerRequestFilter {

    // Some injection here
     
    @Inject
    UserRepository userRepository;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        // Some business logic here...

        UserEntity userEntity = userRepository.findByName(name);
        
        // Some business logic here...
    }
    
}

存储库:

@ApplicationScoped
public class UserRepository implements PanacheMongoRepository<UserEntity> {

    public UserEntity findByName(String name) {
        return find("some query...", name).firstResult();
    }

}

调用存储库时,出现以下异常:

org.jboss.resteasy.spi.UnhandledException: java.lang.IllegalStateException: This method is normally automatically overridden in subclasses...

java.lang.IllegalStateException: This method is normally automatically overridden in subclasses\n\tat io.quarkus.mongodb.panache.common.runtime.MongoOperations.implementationInjectionMissing(MongoOperations.java:765)\n\tat io.quarkus.mongodb.panache.PanacheMongoRepositoryBase.find(PanacheMongoRepositoryBase.java:119)

处理器

class AuthorizeProcessor {

    private static final String FEATURE = "authorize";

    @BuildStep
    FeatureBuildItem feature() {
        return new FeatureBuildItem(FEATURE);
    }

    @BuildStep(onlyIf = IsAuthorizeEnabled.class)
    void registerAuthorizeFilter(
            BuildProducer<AdditionalBeanBuildItem> additionalBeanProducer,
            BuildProducer<ResteasyJaxrsProviderBuildItem> resteasyJaxrsProviderProducer
    ) {
        additionalBeanProducer.produce(new AdditionalBeanBuildItem(UserRepository.class));
        additionalBeanProducer.produce(new AdditionalBeanBuildItem(AuthorizationFilter.class));
        resteasyJaxrsProviderProducer.produce(new ResteasyJaxrsProviderBuildItem(AuthorizationFilter.class.getName()));
    }
}

有什么想法吗?

感谢您的帮助:)

MongoDB with Panache(Hibernate with Panache 也是如此)在构建时使用字节码增强。当此增强功能未发生时,它会导致您在运行时提到的异常:java.lang.IllegalStateException: This method is normally automatically overridden in subclasses

只有当存储库或实体不在 Jandex 索引中时才会发生。 Jandex 用于索引您应用程序的所有代码,以避免使用反射和类路径扫描来发现 类。如果您的实体/存储库不在索引中,这意味着它不是您应用程序的一部分,因为我们会自动索引您应用程序的 类,因此它必须在外部 JAR 中。

通常,这是通过添加 Jandex 插件来索引外部 JAR 的代码来解决的(实际上有多种方法可以做到这一点,请参阅 How to Generate a Jandex Index)。

一个扩展遇到了同样的问题,因为扩展在默认情况下没有被索引。但是从扩展中,您可以通过构建步骤索引所需的 类,这更容易,并且避免用不需要的 类 污染索引。

这可以通过在构建步骤中生成 new AdditionalIndexedClassesBuildItem(UserRepository.class.getName()) 来完成。