java - 是否可以针对特定方法禁用 spring-cloud-stream 的功能绑定?
问题描述
我有一个创建PersistentEntities
bean 的基于 Spring Boot 的库(使用 spring-data-mongo)。PersistentEntities
碰巧实现了Supplier<T>
接口,所以 Spring Cloud Stream 功能绑定器正在创建一个绑定到它。更具体地说,BeanFactoryAwareFunctionRegistry.discoverDefaultDefinitionIfNecessary
发现它是一个 bean 类型Supplier
。
我们正在使用 Spring Cloud Streams Kafka binder,因此 Spring 尝试将这些对象中的每一个发布到它创建的 Kafka 主题。这会在 JSON 序列化程序中导致无限递归问题:
2019-12-04 15:36:54.323 错误 1 --- [scheduling-1] osihLoggingHandler:org.springframework.messaging.MessagingException:调用方法失败;嵌套异常是 org.springframework.messaging.converter.MessageConversionException:无法写入 JSON:无限递归(StackOverflowError)(通过引用链:org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity["idProperty"] -> org. springframework.data.mongodb.core.mapping.CachingMongoPersistentProperty["owner"] -> org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity["idProperty"] -> org.springframework.data.mongodb.core.mapping。 CachingMongoPersistentProperty["owner"] -> org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity["idProperty"] ->
有没有办法将我的 bean 从函数绑定中排除?使用这个库的项目没有使用 Spring Cloud Function,但我更愿意保持这种可能性。
作为参考,我的 bean 定义为:
@Bean
public PersistentEntities myPersistentEntities(List<MongoTemplate> mongoTemplates) {
return new PersistentEntities(() -> {
List<MappingContext<?, ?>> mappingContexts = mongoTemplates.stream().map(t -> t.getConverter().getMappingContext()).collect(Collectors.toList());
return mappingContexts.iterator();
});
}
我们刚刚将 Spring Cloud 从 Greenwich 升级到了 Hoxton,所以自动功能绑定对我们来说是新的。
解决方案
通常,您可以通过将 spring-cloud-function 明确排除为
@SpringBootApplication(exclude = ContextFunctionCatalogAutoConfiguration.class)
也就是说,请提出一个问题 - https://github.com/spring-cloud/spring-cloud-stream/issues。以前出现过这种变体,我开始相信我们需要比上述更好的解决方案。
另一种解决方法是明确指定不存在的spring.cloud.function.definition=blah
属性。blah
丑陋,但可以解决问题,并且不需要重新编译,因为不涉及注释或其他属性。
但正如我所说,请提出一个问题,链接到这篇文章,我们将在今年年底之前为 SR1 解决这个问题。
推荐阅读
- kubernetes - 当数据进入模板更改时如何刷新div
- firebase - Firebase Cloud Messaging 无法在 Android Studio 模拟器上运行
- c - 在 C 中,如何将一个地址的值设置为另一个地址的值?
- github - 获取与拉取请求表单 github api v3 关联的链接问题和项目
- sql - Postgres 根据某些条件设置最终值
- gdb - gdb 7.12.1-48.el7 请求“debuginfo-install”但这些软件包已经安装?
- git - 管理两个单独的远程存储库的最佳方式 - github 和 heroku
- swift - 如何在 UITest 中获得正确的设备屏幕尺寸?
- reactjs - 如何删除引用数组中的引用?
- python-3.x - 为什么 append() 函数在每次迭代中都会改变变量的值?