Spring将实体传递给超类

时间:2018-04-24 15:16:54

标签: spring jpa-2.0 autowired

我已经创建了这样的通用超类:

@Repository
public class RootQueryCreator<T> {

   @PersistenceContext
   private EntityManager em;

   private T entity;
   CriteriaBuilder criteriaBuilder = null;
   CriteriaQuery<T> criteriaQuery = null;
   Root<T> rootTable = null;

   public RootQueryCreator() {}

   public RootQueryCreator(T entity) {
    super();
    this.entity = entity;
   }

   @PostConstruct
   public void initRootQuery() {
    criteriaBuilder = em.getCriteriaBuilder();
    criteriaQuery = (CriteriaQuery<T>) 
    criteriaBuilder.createQuery(this.entity.getClass());        
    rootTable = (Root<T>) criteriaQuery.from(entity.getClass());
}}

此超类将由实体中的每个DAOImpl-Class使用。 像这样:

@Repository
@Qualifier("myEntitiyClass")
public class MyEntityDAOImpl  extends 
RootQueryCreator<MyEntity> { 

@Autowired
public MyEntityDAOImpl() {
    super(new MyEntity()); //pass any Entity for the Root-Class from Criteria-Framework
}

@Override
public List<MyEntity> getAll() throws Exception {
    super.getCriteriaQuery().select(super.rootTable);
    return super.getEm().createQuery(criteriaQuery).getResultList();
}

public List<MyEntity> retrieveData(){

}}  

并且每个DAOImpl-Class都将成为这样的服务类:

@Service
public class myLecture {

@Autowired
@Qualifier("myEntitiyClass")
private JpaRepositority<MyEntityDAOImpl> myEntityDAOImpl;

public void retrieveData(){

     myEntityDAOImpl.retrieveData();
} }

最后我得到了这个错误:

  

IllegalStateException:自动连接的注释至少需要一个   参数:MyEntityDAOImpl()

实际上我不需要将任何实体传递给DAOImpl-Class。 我该怎么办?

1 个答案:

答案 0 :(得分:1)

Autowired注释指定:

  

标记构造函数,字段,setter方法或配置方法   由Spring的依赖注入工具自动启动。

但是您使用@Autowired注释了构造函数,而没有提供任何依赖项作为参数:

@Autowired
public MyEntityDAOImpl() { //-> Empty arg is the issue here
    super(new MyEntity()); //pass any Entity for the Root-Class from Criteria-Framework
}

除了例外:

  

IllegalStateException:自动连接的注释至少需要一个   参数:MyEntityDAOImpl()

事实上,您不需要在MyEntityDAOImpl中自动装配任何内容,因为它在构造函数中不需要任何依赖。所以只需删除注释,让Spring将构造函数作为普通构造函数调用:

public MyEntityDAOImpl() {
    super(new MyEntity()); //pass any Entity for the Root-Class from Criteria-Framework
}