Spring JPA数据:定制通用存储库和服务:UnsatisfiedDependencyException

时间:2018-08-13 13:25:18

标签: java spring-boot spring-data-jpa generic-programming

我正在与许多实体一起提供一个宁静的服务。如果我们考虑两组父亲资源子资源,则两个组成员在其组范围内对CRUD操作的实现方式都相同

因此,每一层不仅只有一个通用类。这是我的代码:

资源库:

具有所有实体都使用的方法的基本存储库:

@Repository
public interface GenericRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
    Page<T> findAll(Pageable pageable);
}

父亲资源存储库

@Repository
public interface EntityGenericRepository<T, ID extends Serializable> extends GenericRepository<T, ID> {
    T findByName(String name);
}

子资源存储库

@Repository
public interface NestedEntityGenericRepository<T, ID extends Serializable> extends GenericRepository<T, ID> {
    Page<T> findByFatherId(ID fatherId, Pageable pageable);
}

服务:

对于基数:

public interface GenericService<T,ID extends Serializable> {
    Page<T> findAll(int page, int size);

    T findById(ID id);
}

对于父亲:

public interface EntityGenericService<T, ID extends Serializable> extends GenericService<T, ID> {
    T findByName(String name);

    T save(T t);

    void update(ID id, T t);

    void softDelete(ID id);
}

和儿童:

public interface NestedEntityGenericService<T, ID extends Serializable> {
    Page<T> findBySensorId(ID fatherId, int page, int size);

    T save(ID fatherId, T t);

    void update(ID fatherId, ID id, T t);

    void softDelete(ID fatherId, ID id);
}

服务实现:

基础:

@Service
public class GenericServiceImpl<T,ID extends Serializable>
        implements GenericService<T,ID> { //codes }

对于父亲:

@Service
public class EntityGenericServiceImpl<T, ID extends Serializable>
        extends GenericServiceImpl<T, ID>
        implements EntityGenericService<T, ID> {//codes}

和儿童:

@Service
public class NestedEntityGenericServiceImpl<T, U, ID extends Serializable>
        extends EntityGenericServiceImpl<T, ID>
        implements NestedEntityGenericService<T, ID> {//codes}

当我运行它时,它只会抛出UnsatisfiedDependencyException。整个消息:

Exception encountered during context initialization - cancelling refresh attempt: 
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating 
bean with name 'entityGenericServiceImpl': Unsatisfied dependency expressed through 
field 'genericRepository': Error creating bean with name 'nestedEntityGenericRepository': 
Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 
Not a managed type: class java.lang.Object; nested exception is 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'nestedEntityGenericRepository': Invocation of init method failed; nested exception is 
java.lang.IllegalArgumentException: Not a managed type: class java.lang.Object

进行了很多搜索,但没有找到解决此问题的方法。感谢您的帮助

致谢

1 个答案:

答案 0 :(得分:2)

我通过为每个实体创建具体的存储库来解决此问题。 我试图减少课程数量。因此,我定义了3个通用存储库来完成为服务所有实体而定义的所有其他存储库的工作。但是我知道这是不可能的,必须在自定义存储库的最后一级中定义具体的存储库才能与服务层进行交互。

原因是反思。 Spring使用反射来做所有幕后工作,并且它必须知道必须为哪个实体使用provider(休眠)

需要注意的是,如果要创建通用服务层,则它的最后一层也必须有具体的实现。因为必须在某个地方声明具体的存储库