我使用Eclipse IDE创建了一个EJB项目。我的Application Server是Glassfish 4.我使用的数据库是Oracle。现在当我运行代码时,我收到了错误消息:
org.jboss.weld.exceptions.DeploymentException:WELD-001408:类型Set< Service>类型的不满意依赖项与限定词@Default 在注射点
请查看下面的代码。
客户:
package de.java2enterprise.onlineshop.ejb;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Customer implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String email;
private String password;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
RegisterBean :
package de.java2enterprise.onlineshop.ejb;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
public class RegisterBean implements RegisterBeanRemote, RegisterBeanLocal {
@PersistenceContext
private EntityManager em;
public RegisterBean() {
}
@Override
public String persist(String email, String password) {
Customer customer = new Customer();
customer.setEmail(email);
customer.setPassword(password);
em.persist(customer);
return email + " persisted";
}
}
RegisterBeanLocal :
package de.java2enterprise.onlineshop.ejb;
import javax.ejb.Local;
@Local
public interface RegisterBeanLocal {
public abstract String persist(
String email,
String password);
}
RegisterBeanRemote :
package de.java2enterprise.onlineshop.ejb;
import javax.ejb.Remote;
@Remote
public interface RegisterBeanRemote {
public abstract String persist(
String email,
String password);
}
最后一个是我的 RegisterController ,它注入RegisterBeanLocal cass:
package de.onlineshop_web.bean;
import java.io.Serializable;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import de.java2enterprise.onlineshop.ejb.RegisterBeanLocal;
@Named
@RequestScoped
public class RegisterController implements Serializable {
private static final long serialVersionUID = 1L;
private String email;
private String password;
@EJB
private RegisterBeanLocal registerBeanLocal;
public String persist() {
String msg = registerBeanLocal.persist(email, password);
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(msg));
return "register";
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
答案 0 :(得分:0)
你的代码不太可能在其中定义Set<Service>
,或者至少是我将要解决的假设。
此错误不明确。但是,如果您可以提供所收到的例外的完整详细信息,而不是停留在qualifiers @Default at injection point
,则有助于获得更清晰的解决方案。
我的预感:
您提到了一个EJB项目,但是您在应用程序中定义了对JSF代码(javax.faces
)的依赖关系。 Glassfish不会在直接部署的EJB上激活JSF。
现在,可能是您提到了EJB项目,但实际上您正在部署WAR。如果是这种情况,我会检查WAR是否打包了不必要的依赖项。
答案 1 :(得分:0)
我相信您在项目中使用Google Guava,正如@maress在他的评论中暗示的那样。有三种可能的解决方案:
META-INF
目录中添加this beans.xml文件
<强>背景强>
Set<Services>
来自番石榴。 Guava使用@Inject
注释,在此特定情况下,它还使用注释@Singleton
。在CDI 1.1(Java EE 7)中,使用@Singleton
注释的bean被自动视为CDI bean,当CDI计算此Guava类的依赖关系时,它会失败 - 更多详细信息:code.google.com/p/guava -libraries /问题/细节?ID = 1433
添加到guava jar文件中,使用bean-discovery=none
禁用CDI的beans.xml解决了这个问题,但仅针对Java EE 7(另一方面,它使Java EE 6中使用的旧CDI机制出现问题)。最后,CDI规范1.2从注释中删除了注释@Singleton
,它将类转换为CDI bean,这也解决了任何版本的Guava的问题。