我已经用Eclipse IDE创建了一个EJB项目。我的应用程序服务器是Glassfish 4。我使用的数据库是Oracle。现在,当我运行代码时,我得到了错误消息:
org.joss.weld.exceptions.DeploymentException:weld-001408:类型Set的依赖项不满足<服务>带有限定符@默认在注射点
看看下面的代码。
客户:
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;
}
}
您的代码中不太可能真正定义了Set<Service>
,或者至少这是我要处理的假设。
此错误不明确。但是,如果您能够提供收到的异常的全部详细信息,而不是停留在qualifiers @Default at injection point
,这将有助于获得更清晰的解决方案。
我的预感:
您提到了一个EJB项目,但是您在应用程序中定义了对JSF代码(javax.faces
)的依赖关系。Glassfish不会在直接部署的EJB上激活JSF。
现在,您可能提到了EJB项目,但实际上您正在部署一个WAR。如果是这样的话,我会检查WAR中是否有不必要的依赖项被打包。
正如@maress在他的评论中暗示的那样,我相信你在项目中使用了谷歌Guava。有3种可能的解决方案:
- 将Guava降级到版本13,据报道该版本没有此问题
- 将beans.xml文件添加到Guava的JAR文件中的
META-INF
目录中 - 将Weld升级到2.2版(或将整个Glassfish升级到4.1版),它实现了CDI1.2的维护版本,修复了Guava的问题
背景:
Set<Services>
来自瓜瓦。Guava使用@Inject
注释,在这种特定情况下,它还使用@Singleton
注释。在CDI 1.1(Java EE 7)中,用@Singleton
注释的bean被自动视为CDI bean,当CDI计算该Guava类的依赖项时,它失败了-更多详细信息请访问:code.google.com/p/Guava-libraries/issues/detail?id=1433
在guava jar文件beans.xml中添加bean-discovery=none
禁用CDI可以解决这个问题,但仅适用于Java EE 7(另一方面,它会给Java EE 6中使用的旧CDI机制带来问题)。最后,CDI规范1.2从注释中删除了注释@Singleton
,这将类转换为CDIBean,这也解决了任何版本的Guava的问题。