没有豆有资格注射到注射点[JSR-299§5.2.1]

fed*_*der 3 java cdi jsf-2

我想注入默认的Java记录器.然而,Eclipse强调它并指出"没有bean有资格注入注射点[JSR-299§5.2.1]"

如果我仍然部署,则抛出以下异常.为什么它无法注入Java Logger?对于EntityManager也是如此,但对于我自己的UserRepository Bean则不行.

org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [Logger] with qualifiers [@Default] at injection point [[field] 
Run Code Online (Sandbox Code Playgroud)

码:

import java.util.logging.Logger;

import javax.ejb.Stateless;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import javax.persistence.EntityManager;

import com.terry.webapp.data.UserRepository;
import com.terry.webapp.model.usermgmt.User;


// The @Stateless annotation eliminates the need for manual transaction demarcation
@Stateless
public class LoginService {

    @Inject
    private Logger log;

    @Inject
    private EntityManager em;

    @Inject
    private UserRepository repository;

    public User login(User user) {
        log.info("login " + user.getUsername());

        User rUser = repository.findByCredentials(user.getUsername(), user.getPassword());
        return rUser;
    }
}
Run Code Online (Sandbox Code Playgroud)

SRy*_*SRy 6

要注入一个记录器,你需要一个生成器方法,Logger它可以提供一个可以注入的方法.

  import java.util.logging.Logger;   

  import javax.enterprise.inject.Produces;   
  import javax.enterprise.inject.spi.InjectionPoint;   

  public class LoggerProduer {   

    @Produces   
    public Logger produceLog(InjectionPoint injectionPoint) {   
      return Logger.getLogger(injectionPoint.getMember().getDeclaringClass()   
          .getName());   
    }   
  }   
Run Code Online (Sandbox Code Playgroud)

并且EntityManager需要使用,@PersistenceContext(unitName="pscontext")因为它是使用您的数据创建的persistence.xml,所以您EntityManager必须这样做

   @PersistenceContex(unitName="pscontext")
   private EntityManager em;
Run Code Online (Sandbox Code Playgroud)

  • 看看这篇文章,您将了解更多有关生产者方法的信息:http://stackoverflow.com/questions/16534728/please-explain-the-produces-annotation-in-cdi.就像@ AVolpe ..提到的如果使用`producer method`在其他类中创建`EntityManager`和`Inject`,当你改变名字时,你不需要寻找所有的地方来改变`@ PersistenceContext`的名字`persistence.xml` (2认同)