小编Ren*_*gio的帖子

容器找不到.jar中的CDI bean(不满意的依赖项)

我创建了一个Java项目作为其他项目的lib,减少了项目之间的代码重复.此lib项目导出到jar以包含在Web项目中(WAR,而不是EAR).

在Web项目中(这些类被删除的地方)一切正常,而所有类都保留在它们上面 - 注入简单和复杂的对象(具有生产者和设置的对象)正常工作.

删除这些类的Web项目并将具有这些相同类的jar添加到Web项目(在Maven项目中的pom.xml中设置此lib)之后,所有内容都会正常编译,就像之前一样.但是在启动服务器时,容器在CDI启动期间找不到现在存在于jar中的类(CDI bean),从而产生这个(着名的)错误:

WELD-001408: Unsatisfied dependencies for type Session with qualifiers (...)
Run Code Online (Sandbox Code Playgroud)

已经在src/main/resources(在WELD和CDI文档中指出)的META-INF文件夹中添加了beans.xml作为项目的根文件夹.

在此输入图像描述

下面是jar中需要注入其他项目的bean(Session,SessionFactory和ExampleLogger)的示例(并且在类在Web项目中时已正常工作)但现在CDI 尚未发现:

public class HibernateConnectionFactory {

    @Produces
    @ApplicationScoped @ConnectionBaseExample
    public SessionFactory createSessionFactoryExample() {
        Configuration configuration = new Configuration();
        configurarSessionFactory(configuration, "baseExampleDS");
        ServiceRegistry registry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();

        return configuration.buildSessionFactory(registry);
    }

    @Produces
    @RequestScoped @ConnectionBaseExample
    public Session createSessionExample(@ConnectionBaseExample SessionFactory sessionFactory) {
        return sessionFactory.openSession();
    }

    public void destruirSessionExemplo(@Disposes @ConnectionBaseExample Session session) {
        if (session.isOpen()) {
            session.close();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
public class ExampleLoggerProducer { …
Run Code Online (Sandbox Code Playgroud)

java-ee cdi jboss-weld weld

7
推荐指数
1
解决办法
3227
查看次数

如何在 Spring 的依赖项/外部 jar 中自动装配组件?

我有一个 Spring Boot 项目,但无法从外部 jar 中获取要自动装配的组件。当我尝试时,我得到一个org.springframework.beans.factory.NoSuchBeanDefinitionException说法,无法找到具有该名称的 bean。

我尝试了在类似问题中找到的一些解决方案,例如:

如何在 Spring 中从外部 Jar 自动装配 @service

Spring Boot @autowired 不起作用,不同包中的类

我如何@Autowire 一个从外部罐子创建的弹簧豆?

..但仍然无法让它工作。

这是我正在尝试完成的一个示例:

在此处输入图片说明

这是Spring Boot 项目spring-project-example中的引导类

package com.springdi.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;

import com.dependency.example.DependencyBasePackageClass;
import com.dependency.example.somepackage.SomeBean;

@SpringBootApplication
@ComponentScan(basePackages = {"com.springdi.example"}, basePackageClasses = DependencyBasePackageClass.class)
public class SpringProjectExampleApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringProjectExampleApplication.class, args);

        String beanName = SomeBean.class.getName();
        System.out.printf("%s can be autowired: %s\n", beanName, String.valueOf(context.containsBean(beanName)).toUpperCase());
    } …
Run Code Online (Sandbox Code Playgroud)

java spring maven spring-boot

3
推荐指数
1
解决办法
2万
查看次数

标签 统计

cdi ×1

java ×1

java-ee ×1

jboss-weld ×1

maven ×1

spring ×1

spring-boot ×1

weld ×1