Java 是否可以禁用spring cloud stream';特定方法的函数绑定?
我有一个基于Spring引导的库(使用Spring data mongo),它创建了一个Java 是否可以禁用spring cloud stream';特定方法的函数绑定?,java,spring-cloud-stream,spring-cloud-function,Java,Spring Cloud Stream,Spring Cloud Function,我有一个基于Spring引导的库(使用Spring data mongo),它创建了一个PersistentEntitiesbeanPersistentEntities碰巧实现了Supplier接口,因此Spring Cloud Stream functional binder正在为其创建绑定。更具体地说,BeanFactoryAwareFunctionRegistry.DiscoverDefaultDefinition如果需要会将其作为供应商类型的bean查找 我们使用的是Spring Clo
PersistentEntities
beanPersistentEntities
碰巧实现了Supplier
接口,因此Spring Cloud Stream functional binder正在为其创建绑定。更具体地说,BeanFactoryAwareFunctionRegistry.DiscoverDefaultDefinition如果需要
会将其作为供应商
类型的bean查找
我们使用的是Spring Cloud Streams Kafka活页夹,因此Spring尝试将这些对象发布到它创建的Kafka主题。这会导致JSON序列化程序中出现无限递归问题:
2019-12-04 15:36:54.323错误1---[scheduling-1]o.s.i.h.LoggingHandler:org.springframework.MessagingException:调用方法失败;嵌套异常为org.springframework.messaging.converter.MessageConversionException:无法写入JSON:无限递归(StackOverflowerr)(通过引用链:org.springframework.data.mongodb.core.mapping.BasicMongoOperationResistentEntity[“idProperty”]->org.springframework.data.mongodb.core.mapping.cachingMongoOperationResistentProperty[“owner”]->org.springframework.data.mongodb.core.mapping.basicMongoProperty[“idProperty”]->org.springframework.data.mongodb.core.mapping.cachingmongOperateSistentProperty[“owner”]->org.springframework.data.mongodb.core.mapping.basicMongoProperty[“idProperty”]->org.springframework.data.mongodb.core.mapping.cachingmongOperateSistentProperty[“所有者”]->org.springframework.data.mongodb.core.mapping.BasicMongOperateSistentEntity[“所有者”]->org.springframework.data.mongodb.core.mapping.cachingmongOperateSistentProperty[“所有者”]->org.springframework.data.mongodb.core.mapping.BasicMongOperateSistentEntity[“idProperty”]->org.springframework.data.mongodb.core.mapping.cachingmongOperateProperty[“所有者”]->org.springframework.data.mongodb.core.mapping.basicMongoOperateProperty[“idProperty”]->org.springframework.data.mongodb.core.mapping.cachingmongOperateProperty[“所有者”]
有没有办法将我的bean从函数绑定中排除?使用这个库的项目没有使用SpringCloud函数,但我更愿意保留这种可能性
作为参考,my 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();
});
}
@Bean
公共持久性实体我的持久性实体(列表mongoTemplates){
返回新的持久性实体(()->{
List通常,您可以通过将spring cloud函数显式排除为
@SpringBootApplication(exclude = ContextFunctionCatalogAutoConfiguration.class)
也就是说,请提出一个问题-。之前已经出现过这种变体,我开始相信我们需要一个比上述更好的解决方案
另一个解决方法是显式指定spring.cloud.function.definition=blah
属性,其中blah
是不存在的。丑陋,但有技巧,不需要重新编译,因为不涉及任何注释或附加属性
但是太长了,读不下去了,请把这个问题联系起来,链接到这个帖子,我们会在今年年底之前把它写到SR1上。
< P> >,我遇到了类似的事情。TL;DrFig是明确定义了这样的云云流可用的函数:
消费者Bean名称:inputConsumer
spring:
cloud:
stream:
function:
bindings:
inputConsumer-in-0: DataInputBinding
definition: inputConsumer
bindings:
DataInputBinding:
binder: kinesis
destination: whatever
group: whatever
在我的情况下,我的应用程序有另一个spring组件
,它实现了供应商
。spring Cloud Streams没有在配置中明确定义函数,只是将所有函数
、消费者
和供应商
bean添加到函数目录
,然后期望所有它们的一部分附着在一条小溪上
显然,如果它们不是,那么它就不会附加它们中的任何一个,任何东西都不起作用。//我最终作弊并创建了一个FunctionCatalog bean,这具有相同的效果,但这更为明确。我也创建了一个新问题: