【问题标题】:WELD-001408 Unsatisfied dependencies for type [Logger] with qualifiers [@Default] at injection point [[field] using arquillianWELD-001408 使用 arquillian 在注入点 [[field] 处带有限定符 [@Default] 的类型 [Logger] 的依赖关系不满足
【发布时间】:2013-11-04 13:11:11
【问题描述】:

我正在运行一个基本的 arquillian 单元测试,使用 arquillian 网站上的 Greeter 示例。唯一的区别是在 Greeter.java 的 greet(PrintStream to, String name) 函数中执行 log.debug。我正在使用 slf4j 进行日志记录。

Greeter.java

package org.arquillian.example;
import java.io.PrintStream;

import javax.inject.Inject;

import org.slf4j.Logger;

public class Greeter {

@Inject
private Logger log;

    public void greet(PrintStream to, String name) {
        log.debug("Greeter Testing");
        to.println(createGreeting(name));
    }

    public String createGreeting(String name) {
        return "Hello, " + name + "!";
    }   

}

GreeterTest.java

package org.arquillian.example;

import javax.inject.Inject;

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.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;


@RunWith(Arquillian.class)
public class GreeterTest {

    @Inject
    Greeter greeter;    


    @Deployment
    public static JavaArchive createDeployment() {
        return ShrinkWrap.create(JavaArchive.class)
            .addClass(Greeter.class)
            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
    }

    @Test
    public void should_create_greeting() {

        Assert.assertEquals("Hello, Earthling!",
            greeter.createGreeting("Earthling"));
        greeter.greet(System.out, "Earthling");
    }   

}

运行测试时,在注入点 [[field] @Inject private org.arquillian.example.Greeter.log] 出现 WELD-001408 类型 [Logger] 与限定符 [@Default] 的不满足依赖关系。有人可以帮忙吗?

【问题讨论】:

    标签: jboss-arquillian


    【解决方案1】:

    这是一个 CDI 问题。首先,您的Logger 没有制作人。

    其次,应将任何此类生产者添加到 ShrinkWrap 部署中。

    Logger 的生产者通常是这样写的:

    import javax.enterprise.inject.Produces;
    import javax.enterprise.inject.spi.InjectionPoint;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class SLF4JProducer {
    
      @Produces
      public Logger producer(InjectionPoint ip){
        return LoggerFactory.getLogger(
          ip.getMember().getDeclaringClass().getName());
      }
    }
    

    这个生产者收到一个注入点并继续返回一个 SLF4J Logger 实例。该实例与包含注入点的类同名。

    【讨论】:

      【解决方案2】:

      还将 bean.xml bean-discovery-mode 更改为 all

      bean-discovery-mode="all"
      

      【讨论】:

        【解决方案3】:

        当我使用 LoggerFactory 时,它对我来说工作得很好,而不是注入 Logger。

        private Logger log = LoggerFactory.getLogger(Greeter.class);
        

        【讨论】:

          【解决方案4】:

          在我的情况下,我必须以编程方式提供注射

          进口:

                 import org.slf4j.Logger;
                 import org.slf4j.LoggerFactory;
          

          初始化

                  private Logger logger;
          
                  @Inject
                  public LoggingInterceptor() {
                      logger = LoggerFactory.getLogger(LoggingInterceptor.class);
                  }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-08-28
            • 1970-01-01
            • 1970-01-01
            • 2020-03-26
            • 2014-06-12
            • 2014-12-20
            • 2020-05-04
            • 2015-06-10
            相关资源
            最近更新 更多