我有一个基于Spring Boot的库(使用spring-data-mongo),它创建一个PersistentEntities
bean。PersistentEntities
碰巧实现了该Supplier<T>
接口,因此Spring Cloud Stream功能绑定器正在为其创建绑定。更具体地说,将其BeanFactoryAwareFunctionRegistry.discoverDefaultDefinitionIfNecessary
查找为type的bean Supplier
。
我们使用的是Spring Cloud Streams Kafka活页夹,因此Spring尝试将每个对象发布到它创建的Kafka主题。这会在JSON序列化程序中引起无限递归问题:
2019-12-04 15:36:54.323错误1--[schedule-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 [“所有者”]-> 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。
有没有办法从函数绑定中排除我的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从格林威治升级到Hoxton,因此自动功能绑定对我们来说是新的。
通常,您可以通过将Spring-cloud-function明确排除为
@SpringBootApplication(exclude = ContextFunctionCatalogAutoConfiguration.class)
也就是说,请提出一个问题-https: //github.com/spring-cloud/spring-cloud-stream/issues。以前已经出现过各种变化,我开始相信我们需要比上述更好的解决方案。
另一个解决方法是显式指定不存在的spring.cloud.function.definition=blah
属性blah
。丑陋,但是可以解决问题,并且由于不涉及任何注释或其他属性,因此不需要重新编译。
但是正如我所说,请提出一个问题,链接到此帖子,我们将在今年年底之前针对SR1解决该问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句