【问题标题】:No bean is eligible for injection to the injection point [JSR-299 §5.2.1]没有 bean 有资格注入到注入点 [JSR-299 §5.2.1]
【发布时间】:2013-11-15 13:18:23
【问题描述】:

我想注入默认的 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] 

代码:

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;
    }
}

【问题讨论】:

    标签: java jsf-2 cdi


    【解决方案1】:

    要注入一个记录器,你需要一个生产者方法,它提供一个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());   
        }   
      }   
    

    而EntityManager 需要使用@PersistenceContext(unitName="pscontext") 注入,因为它是使用您的persistence.xml 中的数据创建的,所以您的EntityManager 必须是

       @PersistenceContex(unitName="pscontext")
       private EntityManager em;
    

    【讨论】:

    • 也可以使用:@Produces @PersistenceContex(unitName="pscontext") EntityManager em;如果你想@Inject EntityManager.
    • 我只是不明白何时需要创建自己的 Producer 以及何时适用于简单用户 @Inject。这样做的先决条件是什么?
    • 查看这篇文章,您将了解更多关于 Producer 方法的信息:stackoverflow.com/questions/16534728/…。像@AVolpe..提到如果您使用producer method 在其他类中创建EntityManager 和Inject,则当您在@ 中更改名称时,您无需查找所有更改@ PersistenceContext 名称的地方987654333@
    • 我也有同样的问题,唯一的办法就是把 EJB 改成 Stateful,这是为什么呢?我需要让它与无状态 EJB 一起工作。
    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多