我的問題與此處解釋的相同:JBoss7.1.3: @EJB works while @Inject fails 推測這甚至是相同的設置(Wildfly 8.0)。未能使用CDI注入log4j - WELD-001408:對於具有限定符的Logger類型的不滿意依賴關係@Default
儘管有生產者的資源類,我不能注入一個記錄器實例。控制器中的Neiter,也不在EJB中。 [問題1]糾正我,如果我錯了,我應該能夠將它們注入到@Model bean和用@Stateless(EJB)註釋的bean中,不是嗎?
package com.doe.webapp.service.auxilliary.cdiproducer;
import javax.enterprise.context.Dependent;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.faces.context.FacesContext;
import org.apache.log4j.Logger;
@Dependent
public class Resources {
@Produces
public Logger produceLog(InjectionPoint injectionPoint) {
return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
}
@Produces
@RequestScoped
public FacesContext produceFacesContext() {
return FacesContext.getCurrentInstance();
}
}
這裏是我的控制器的開始:
package com.doe.webapp.controller.security;
import java.io.IOException;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.enterprise.inject.Model;
import javax.enterprise.inject.Produces;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedProperty;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.Pattern;
import org.slf4j.Logger;
import com.doe.webapp.model.usermgmt.User;
import com.doe.webapp.service.security.LoginService;
@Model
public class LoginController {
private static final String ADMIN = "admin";
@Inject
private Logger log;
@Inject
private FacesContext facesContext;
@Inject
private LoginService loginService;
[...]
這裏是EJB,這也被注入在@Model註解的類。同樣的記錄器。前者工作時,Logger的注入會拋出先前解釋的錯誤。
package com.doe.webapp.service.security;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import com.doe.webapp.data.UserRepository;
import com.doe.webapp.model.usermgmt.User;
@Stateless
public class LoginService {
@Inject
private transient Logger log;
@Inject
private UserRepository repository;
@Inject
private Event<User> userEvent;
public User login(User user) {
log.info("login " + user.getUsername());
User rUser = repository.findByCredentials(user.getUsername(), user.getPassword());
return rUser;
}
}
現在,我得到一個錯誤的LoginController.java控制器。
WELD-001408: Unsatisfied dependencies for type Logger with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject private com.doe.webapp.controller.security.LoginController.log
at com.doe.webapp.controller.security.LoginController.log(LoginController.java:0)
另一個用於LoginService.java的Enterprise Bean。
WELD-001408: Unsatisfied dependencies for type Logger with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject private transient com.doe.webapp.service.security.LoginService.log
at com.doe.webapp.service.security.LoginService.log(LoginService.java:0)
[問題2]:我不知道這個注射失敗,WELD-001408錯誤。
謝謝,這解決了EJB(LoginService.java)的異常! (如果我可以upvote,我會的!)。現在,ManagedBean(LoginController.java)與以前一樣留下了異常:'WELD-001408:具有限定符的類型記錄器的不滿意依賴關係@Default 處於注入點[BackedAnnotatedField] @Inject private com.doe.webapp.controller.security。 LoginController.log at com.doe.webapp.controller.security.LoginController.log(LoginController.java:0)' – feder
@feder:您確定您在所有這三個地方都更改了導入嗎? – palacsint
你說得對。一個指向'org.apache.log4j.Logger',另一個指向'org.log4j.Logger'。猜到了! – feder