【问题标题】:WELD-001408: Unsatisfied dependencies for type Logger with qualifiers @Default at injection point [BackedAnnotatedField] @InjectWELD-001408:在注入点 [BackedAnnotatedField] @Inject 具有限定符 @Default 的类型 Logger 的依赖关系不满足
【发布时间】:2020-08-19 17:14:53
【问题描述】:

我在使用 Arquillian 测试 JavaEE8 应用程序时遇到了这个问题:WELD-001408: Unsatisfied dependencies for type Logger with qualifiers @Default 在注入点 [BackedAnnotatedField] @Inject private academy.learnprogramming.services.TodoService.LOG

注入的EntityManager也出现同样的错误

这些是我的课程:

TodoService.class(我必须测试的类)

package academy.learnprogramming.services;

import academy.learnprogramming.entities.Todo;
import org.apache.log4j.Logger;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.transaction.Transactional;
import java.util.List;

@Transactional
public class TodoService {

    @Inject
    private Logger LOG = Logger.getLogger(TodoService.class);

    @Inject
    EntityManager entityManager;

    public Todo createTodo(Todo todo) {
        //Persist into db
        entityManager.persist(todo);
        return todo;
    }

    public Todo updateTodo(Todo todo) {
        entityManager.merge(todo);
        return todo;
    }

    @PostConstruct
    private void init() {
        LOG.info("Bean TodoService created");
    }

    public Todo findTodoById(Long id) {
        return entityManager.find(Todo.class, id);
    }

    public List<Todo> getTodos(){
        return entityManager.createQuery("SELECT t from Todo t", Todo.class).getResultList();
    }

}

TodoServiceTest.class(用于测试的类)

package academy.learnprogramming.services;

import academy.learnprogramming.config.Producers;
import academy.learnprogramming.entities.Todo;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

@RunWith(Arquillian.class)
public class TodoServiceTest {

    @Deployment
    public static JavaArchive createDeployment() {
        return ShrinkWrap.create(JavaArchive.class)
                .addClasses(TodoService.class, Todo.class, Producers.class)
                .addAsResource("persistence.xml", "META-INF/persistence.xml")
                .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
    }

    @Before
    public void setUp() throws Exception {
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void createTodo() {
    }

    @Test
    public void updateTodo() {
    }

    @Test
    public void findTodoById() {
    }

    @Test
    public void getTodos() {
    }
}

Producers.class(用于将第 3 方库添加到 CDI 的类)

package academy.learnprogramming.config;


import org.apache.log4j.Logger;
import org.dozer.DozerBeanMapper;

import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.ArrayList;
import java.util.List;

//If producers becomes complitated, split it in many classes, each for a single producer
public class Producers {

    @Produces
    @PersistenceContext
    EntityManager entityManager;

    @Produces
    public Logger produceLogger(InjectionPoint injectionPoint) {
        return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
    }

    //Auto mapper
    @Produces
    public DozerBeanMapper produceDozenBeanMapper() {
        DozerBeanMapper mapper = new DozerBeanMapper();
        List<String> mappingFiles = new ArrayList();
        mappingFiles.add("dozerJdk8Converters.xml");
        mapper.setMappingFiles(mappingFiles);
        return mapper;
    }
}

四处搜索,我了解到可能的问题可能是:

  1. beans.xml 如果你不放 bean-discovery-mode="all" 可能会出现问题,因为它不会扫描未注释的 bean,但我的 beans.xml 文件有 bean-discovery-mode="全部”
  2. 注入 TodoService 类的 Logger 和 EntityManager 不能有 Producer,但我有 Producers 类
  3. 在导入 TodoService、TodoServiceTest 和 Producers 类的 Logger 类时,人们可能会出错,例如在一个类中导入 org.apache.log4j.Logger,在另一个类中导入 java util.logging.Logger,但我拥有所有导入 org.apache.log4j.Logger 的类

如果我删除 @Inject 注释并使用类中的记录器,它可以工作。

我还能尝试什么? 非常感谢您的宝贵时间。

【问题讨论】:

  • 当我在战争中缺少依赖时,我看到了这种异常。我会尝试将记录器添加到战争中。类似.addClass(Logger.class)

标签: java dependency-injection cdi jboss-arquillian java-ee-8


【解决方案1】:

如果您使用 WAR 文件,请尝试使用 WebArchive

 @Deployment
    public static WebArchive createDeployment() {
        return ShrinkWrap.create(WebArchive.class)
                .addClasses(TodoService.class, Todo.class, Producers.class)
                .addAsResource("persistence.xml", "META-INF/persistence.xml")
                .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
}

删除 Logger.getLogger(TodoService.class); 它将实例化记录器的生产者。

@RequestScoped
@Transactional
public class TodoService {

    @Inject
    private Logger log;

    @Inject
    EntityManager entityManager;

    public Todo createTodo(Todo todo) {
        //Persist into db
        entityManager.persist(todo);
        return todo;
    }

    public Todo updateTodo(Todo todo) {
        entityManager.merge(todo);
        return todo;
    }

    @PostConstruct
    private void init() {
        log.info("Bean TodoService created");
    }

    public Todo findTodoById(Long id) {
        return entityManager.find(Todo.class, id);
    }

    public List<Todo> getTodos(){
        return entityManager.createQuery("SELECT t from Todo t", Todo.class).getResultList();
    }

【讨论】:

  • 即使这是一个错误(我感谢您找到它),问题与此无关并且它继续出现。我还添加了 @RequestScoped 注释(即使默认情况下也是如此),但没有任何变化。如果您需要更多信息,此链接显示完全相同的问题:thetopsites.net/article/52333305.shtml
  • 路易斯你好!我已将 JavaArchive 更改为 WebArchive,它可以正常工作!非常感谢您的帮助。我赞成您的回答,但由于我是新来的,因此收到了以下消息:“感谢您的反馈!声望低于 15 人的投票将被记录,但不要更改公开显示的帖子分数。”此外,对于那些想要更好地了解 arquillian 中档案之间的区别的人:arquillian.org/guides/shrinkwrap_introduction
猜你喜欢
  • 2020-05-04
  • 2020-03-26
  • 2015-06-10
  • 2018-12-19
  • 2015-04-05
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
相关资源
最近更新 更多