是否可以针对特定方法禁用 spring-cloud-stream 的功能绑定?
Is it possible to disable spring-cloud-stream's functional binding for a specific method?
我有一个 Spring 基于引导的库(使用 spring-data-mongo),它创建了一个 PersistentEntities
bean。 PersistentEntities
恰好实现了 Supplier<T>
接口,因此 Spring Cloud Stream 功能绑定器正在创建一个绑定到它。更具体地说,BeanFactoryAwareFunctionRegistry.discoverDefaultDefinitionIfNecessary
发现它是 Supplier
.
类型的 bean
我们正在使用 Spring Cloud Streams Kafka 活页夹,因此 Spring 尝试将这些对象中的每一个发布到它创建的 Kafka 主题。这会在 JSON 序列化程序中导致无限递归问题:
2019-12-04 15:36:54.323 ERROR 1 --- [ scheduling-1] o.s.i.h.LoggingHandler : org.springframework.messaging.MessagingException: Failed to invoke method; nested exception is org.springframework.messaging.converter.MessageConversionException: Could not write JSON: Infinite recursion (WhosebugError) (through reference chain: 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"] -> 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"] -> org.springframework.data.mongodb.core.mapping.CachingMongoPersistentProperty["owner"] -> org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity["idProperty"] -> org.springframework.data.mongodb.core.mapping.CachingMongoPersistentProperty["owner"]
...
有没有办法将我的 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
是不存在的。丑陋,但可以解决问题,并且不需要重新编译,因为不涉及注释或其他属性。
但正如我所说,请提出一个问题,link 对此 post 我们将在年底前为 SR1 解决它。
所以,我 运行 喜欢类似的东西。 TL;DR 修复是显式定义可用于 Spring Cloud Streams 的函数,如下所示:
消费者 Bean 名称:inputConsumer
spring:
cloud:
stream:
function:
bindings:
inputConsumer-in-0: DataInputBinding
definition: inputConsumer
bindings:
DataInputBinding:
binder: kinesis
destination: whatever
group: whatever
在我的情况下,我的应用程序有另一个 spring Component
实现 Supplier
。没有明确定义配置中的功能,Spring Cloud Streams 只是将所有 Function
、Consumer
和 Supplier
bean 添加到 FunctionCatalog
,然后期望所有这些 bean附加到流。
显然,如果它们不是,那么它就不会附加任何一个并且没有任何作用。 :/
我有一个 Spring 基于引导的库(使用 spring-data-mongo),它创建了一个 PersistentEntities
bean。 PersistentEntities
恰好实现了 Supplier<T>
接口,因此 Spring Cloud Stream 功能绑定器正在创建一个绑定到它。更具体地说,BeanFactoryAwareFunctionRegistry.discoverDefaultDefinitionIfNecessary
发现它是 Supplier
.
我们正在使用 Spring Cloud Streams Kafka 活页夹,因此 Spring 尝试将这些对象中的每一个发布到它创建的 Kafka 主题。这会在 JSON 序列化程序中导致无限递归问题:
2019-12-04 15:36:54.323 ERROR 1 --- [ scheduling-1] o.s.i.h.LoggingHandler : org.springframework.messaging.MessagingException: Failed to invoke method; nested exception is org.springframework.messaging.converter.MessageConversionException: Could not write JSON: Infinite recursion (WhosebugError) (through reference chain: 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"] -> 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"] -> org.springframework.data.mongodb.core.mapping.CachingMongoPersistentProperty["owner"] -> org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity["idProperty"] -> org.springframework.data.mongodb.core.mapping.CachingMongoPersistentProperty["owner"] ...
有没有办法将我的 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
是不存在的。丑陋,但可以解决问题,并且不需要重新编译,因为不涉及注释或其他属性。
但正如我所说,请提出一个问题,link 对此 post 我们将在年底前为 SR1 解决它。
所以,我 运行 喜欢类似的东西。 TL;DR 修复是显式定义可用于 Spring Cloud Streams 的函数,如下所示:
消费者 Bean 名称:inputConsumer
spring:
cloud:
stream:
function:
bindings:
inputConsumer-in-0: DataInputBinding
definition: inputConsumer
bindings:
DataInputBinding:
binder: kinesis
destination: whatever
group: whatever
在我的情况下,我的应用程序有另一个 spring Component
实现 Supplier
。没有明确定义配置中的功能,Spring Cloud Streams 只是将所有 Function
、Consumer
和 Supplier
bean 添加到 FunctionCatalog
,然后期望所有这些 bean附加到流。
显然,如果它们不是,那么它就不会附加任何一个并且没有任何作用。 :/