应用程序上下文中某些bean的依赖关系形成一个循环

时间:2017-01-12 08:51:39

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

我正在使用JPA开发Spring Boot v1.4.2.RELEASE应用程序。

我定义了存储库接口和实现

ARepository

@Repository
public interface ARepository extends CrudRepository<A, String>, ARepositoryCustom, JpaSpecificationExecutor<A> {
}

ARepositoryCustom

@Repository
public interface ARepositoryCustom {
    Page<A> findA(findAForm form, Pageable pageable);
}

ARepositoryImpl

@Repository
public class ARepositoryImpl implements ARepositoryCustom {
    @Autowired
    private ARepository aRepository;
    @Override
    public Page<A> findA(findAForm form, Pageable pageable) {
        return aRepository.findAll(
                where(ASpecs.codeLike(form.getCode()))
                .and(ASpecs.labelLike(form.getLabel()))
                .and(ASpecs.isActive()),
                pageable);
    }
}

一项服务 的 AServiceImpl

@Service
public class AServiceImpl implements AService {
    private ARepository aRepository;
    public AServiceImpl(ARepository aRepository) {
        super();
        this.aRepository = aRepository;
    }
    ...
}

我的应用程序不会以消息开头:

***************************
APPLICATION FAILED TO START
***************************

Description:

The dependencies of some of the beans in the application context form a cycle:

|  aRepositoryImpl
└─────┘

我遵循了http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.single-repository-behaviour

中描述的所有步骤

请帮忙!

劳伦

3 个答案:

答案 0 :(得分:5)

对原始问题有一个简单的解决方法: 只需从ARepositoryCustom和ARepositoryImpl中删除@Repository即可。 保留所有命名和接口/类层次结构。他们都没事。

答案 1 :(得分:4)

使用d = json.loads(j) r = {} for key, value in d.items(): r[key] = { k : value[0][k] for k in ['email', 'date', 'order_id', 'store'] } r[key]['object_sales_types'] = [ { 'id_type_sale' : s['id_type_sale'], 'sale_type_description' : s['sale_type_description'] } for s in value] print(json.dumps(r, indent=4))

打破周期的一种简单方法是说Spring懒惰地初始化一个bean。那就是:与其完全初始化bean,不如创建一个代理以将其注入到另一个bean中。注入的bean仅在第一次需要时才完全创建。

{
    "105": {
        "email": null,
        "date": "2016-05-18",
        "order_id": 105,
        "store": "Ezio store",
        "object_sales_types": [
            {
                "id_type_sale": 2,
                "sale_type_description": "Coffee shop"
            },
            {
                "id_type_sale": 5,
                "sale_type_description": "Book shop"
            }
        ]
    },
    "106": {
        "email": null,
        "date": "2016-05-19",
        "order_id": 106,
        "store": "Ezio store",
        "object_sales_types": [
            {
                "id_type_sale": 3,
                "sale_type_description": "Food"
            },
            {
                "id_type_sale": 8,
                "sale_type_description": "Articles"
            }
        ]
    }
}

来源:https://www.baeldung.com/circular-dependencies-in-spring

答案 2 :(得分:2)

我测试了您的源代码,发现了一些棘手的问题。

首先,使用您的源代码,我收到以下错误:

There is a circular dependency between 1 beans in the application context:
- ARepositoryImpl (field private test.ARepository test.ARepositoryImpl.aRepository)
- aRepositoryImpl

然后,我猜Spring&#39;迷茫&#39;在ARepository(JPA存储库)和ARepositoryImpl(自定义存储库)之间。 因此,我建议您 ARepository重命名为其他内容,例如BRepository。如果我重命名了类名,它就可以了。

根据Spring Data的官方文档(https://docs.spring.io/spring-data/jpa/docs/current/reference/html/):

  

这些类需要遵循将命名空间元素的属性repository-impl-postfix附加到找到的存储库接口名称的命名约定。 此后缀默认为Impl