【发布时间】:2015-10-19 08:22:53
【问题描述】:
我想在 maven 项目中使用 CDI+JSF+HIBERNATE+PRIMEFACES 的实现。 我的 pom.xml 是这样的:
<dependencies>
<!-- PROJECT LOMBOK -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.6</version>
<scope>provided</scope>
</dependency>
<!-- MYSQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
<!-- HIBERNATE -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.6.3.Final</version>
</dependency>
<!-- CDI -->
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>1.2</version>
</dependency>
<!-- SLF4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.12</version>
</dependency>
<!-- PRIMEFACES -->
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>5.2</version>
</dependency>
</dependencies>
我的项目的结构是这样的,我在不同的类中实现时使用通用接口。 我在 3 个类中实现的一个接口 IGenericDAO 我是这样在 UserDao + PersonDao + RoleDao 中实现的
public interface IGenericDAO<T> {
void save(T object);
void update(T object);
T getObjectById(int id);
List<T> getAll(); }
实现是
public class UserDAOImpl implements IGenericDAO<User> {
@Override
public void save(User user) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
session.save(user);
transaction.commit();
} catch (Exception e) {
if (transaction != null)
transaction.rollback();
throw e;
} finally {
session.close();
HibernateUtil.getSessionFactory().close();
}
}
@Override
public void update(User user) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
session.update(user);
transaction.commit();
} catch (Exception e) {
if (transaction != null)
transaction.rollback();
throw e;
} finally {
session.close();
HibernateUtil.getSessionFactory().close();
}
}
@Override
public User getObjectById(int id) {
Session session = HibernateUtil.getSessionFactory().openSession();
try {
return (User) session.createCriteria(User.class).add(Restrictions.eq("id", id)).list().get(0);
} catch (Exception e) {
throw e;
} finally {
session.close();
HibernateUtil.getSessionFactory().close();
}
}
@SuppressWarnings("unchecked")
@Override
public List<User> getAll() {
Session session = HibernateUtil.getSessionFactory().openSession();
try {
return session.createCriteria(User.class).list();
} catch (Exception e) {
throw e;
} finally {
session.close();
HibernateUtil.getSessionFactory().close();
}
}}
像这样我将服务编码为,我使用通用接口并在 3 个类中实现代码,如下所示:
public interface IGenericService<T> {
void save(T object);
void update(T object);
T getObjectById(int id);
List<T> getAll(); }
实现
@RequestScoped
public class UserServiceImpl implements IGenericService<User> {
@Setter
@Inject
private IGenericDAO<User> dao;
@Override
public void save(User user) {
dao.save(user);
}
@Override
public void update(User user) {
dao.update(user);
}
@Override
public User getObjectById(int id) {
return dao.getObjectById(id);
}
@Override
public List<User> getAll() {
return dao.getAll();
}}
最后,ManagedBean 是这样的:
@Named(value = "authentication")
@RequestScoped 公共类 AuthenticationBean 实现 Serializable {
private static final long serialVersionUID = 2288439665206779666L;
@Getter
@Setter
private String message;
@Setter
@Inject
private IGenericService<User> userService;
@PostConstruct
public void init() {
message = userService.getObjectById(1).getLastname();
}}
每次我运行 glassfish 服务器时都会出现以下错误: 例外 0: org.jboss.weld.exceptions.DeploymentException: WELD-001408: IGenericDAO 类型的依赖关系不满足,带有限定符@Default 在注入点 [BackedAnnotatedField] @Inject private ma.salaried.service.impl.PaymentServiceImpl.dao
【问题讨论】:
-
是的,我是 CDI 的初学者。但是,如果我理解正确,我必须做 Inject (Implementation) insted of Inject (Interface) ?
-
我尝试了你的提议,但没有任何改变 确切的错误是:org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type IGenericDAO
with qualifiers Default at injection point [BackedAnnotatedField] 注入私有 ma.salaried.service.impl.UserServiceImpl.dao org.jboss.weld.exceptions.DeploymentException: WELD-001408: 带有限定符的 IGenericDAO 类型的不满足依赖项 默认在注入点 [BackedAnnotatedField] @Inject private ma.salaried.service.impl.PaymentServiceImpl.dao -
org.jboss.weld.exceptions.DeploymentException: WELD-001408: IGenericDAO
类型的依赖项不满足注入点的默认值 [BackedAnnotatedField] @Inject private ma.salaried.service.impl。 PaymentServiceImpl.dao -
异常 0 : org.jboss.weld.exceptions.DeploymentException: WELD-001408: IGenericDAO
类型的依赖关系不满足 带有限定符的默认注入点 [BackedAnnotatedField] @Inject private ma.salaried.service .impl.EmployeeServiceImpl.dao -
我通过在 DAO 的实现中添加 @RequestScoped 来解决我的问题。我注入了接口而不是实现哦他们
标签: java jsf cdi managed-bean