У меня есть библиотека на основе Spring Boot (с использованием spring-data-mongo), которая создает PersistentEntities
bean. PersistentEntities
реализует интерфейс Supplier<T>
, поэтому функциональный связыватель Spring Cloud Stream создает привязку к нему. В частности, BeanFactoryAwareFunctionRegistry.discoverDefaultDefinitionIfNecessary
находит его как bean-компонент типа Supplier
.
Мы используем связыватель Spring Cloud Streams Kafka, поэтому Spring пытается опубликовать каждый из этих объектов в создаваемой им теме Kafka. Это вызывает проблему с бесконечной рекурсией в сериализаторе JSON:
2019-12-04 15: 36: 54.323 ОШИБКА 1 --- [scheduling-1] o.s.i.h.LoggingHandler: org.springframework.messaging.MessagingException: не удалось вызвать метод; вложенное исключение - org.springframework.messaging.converter.MessageConversionException: не удалось записать JSON: бесконечная рекурсия (StackOverflowError) (через цепочку ссылок: org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity ["idProperty"]. springframework.data.mongodb.core.mapping.CachingMongoPersistentProperty ["владелец"] -> 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> ["владелец". springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity ["idProperty"] -> org.springframework.data.mongodb.core.mapping.CachingMongoPersistentProperty ["владелец"] -> org.springframework.data.mongodb.core.mapping. BasicMongoPersistentEntity ["idProperty"] -> org.springframewor k.data.mongodb.core.mapping.CachingMongoPersistentProperty ["владелец"] -> org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity ["idProperty"] -> org.springframework.data.mongodb.core.mapping. CachingMongoPersistentProperty ["владелец"] ...
Есть ли способ исключить мой bean-компонент из привязки функций? Проект, использующий эту библиотеку, не использует функцию Spring Cloud, но я бы предпочел оставить эту возможность открытой.
Для справки, мой 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, поэтому автоматические функциональные привязки для нас в новинку.