我有一个小型的标准Sping Boot 微服务,它是针对一个Mongo DB集合的Spring Data REST。该文档包含UUID字段。由于需求,该集合是一个有上限的集合。
现在我可以在我的机器上本地构建和运行应用程序,这没有问题。但是,我们在生产环境中运行Docker中的所有内容。包含服务的容器构建没有任何问题,但一旦启动,就会出现以下错误:
{"timestamp":"2023-01-13T15:10:01.592Z","message":"Servlet.service()
for servlet [dispatcherServlet] in context with path [] threw exception
[Request processing failed; nested exception is
org.springframework.core.convert.ConverterNotFoundException:
No converter found capable of converting from type [org.bson.types.Binary]
to type [java.util.UUID]] with root cause",
"component":"org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet]",
"level":"ERROR","stack_trace":
"org.springframework.core.convert.ConverterNotFoundException:
No converter found capable of converting from type [org.bson.types.Binary]
to type [java.util.UUID]
at org.springframework.core.convert.support.GenericConversionService
.handleConverterNotFound(GenericConversionService.java:322)
...
at org.springframework.data.mongodb.core.convert.MappingMongoConverter
.doConvert(MappingMongoConverter.java:1826)
...
at org.springframework.data.mongodb.repository.support.SimpleMongoRepository
.findAll(SimpleMongoRepository.java:444)
其实我有几个问题:
1.基本上,如何处理它?是否可以使用Spring配置来处理?
1.为什么在应用程序启动期间调用SimpleMongoRepository.findAll()?
1.我们有几个Mongo DB的应用程序--它们都很好。Spring Data REST在这方面有什么问题吗?
1.为什么构建正常,但是当容器启动时失败了?
代码示例和服务一样位于Groovy上(默认情况下所有内容都是公共的)。
@RepositoryRestResource( collectionResourceRel = 'events', path = 'events' )
interface EventRepository extends MongoRepository<EventMessage, String> { }
收集配置如下所示
class CustomApplicationRunner implements ApplicationRunner {
@Autowired
MongoTemplate mongoTemplate
@Autowired
ApplicationProperties configuration
@Override
void run(ApplicationArguments args) throws Exception {
mongoTemplate.writeResultChecking = WriteResultChecking.EXCEPTION
if ( !mongoTemplate.collectionExists( EventMessage ) ) {
mongoTemplate.createCollection(EventMessage, new CollectionOptions(
configuration.mongoCollectionMaxSizeBytes,
configuration.mongoCollectionMaxDocuments,
configuration.mongoCappedCollection )
)
}
}
}
在application.yml中,mongo配置是(在开发端)
mongodb:
uri: mongodb://mongodb:27017/development
auto-index-creation: true
uuid-representation: STANDARD
authentication-database: admin
Sping Boot 依赖项包括
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-amqp'
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
implementation 'org.springframework.boot:spring-boot-starter-integration'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-rest'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
版本:Spring引导2.7.7,Groovy 4.0.6
我做了一点调查。
Here是Mongo DB驱动程序支持二进制和BsonBinary的UUID转换的JIRA问题。然而,只有BsonBinary被更新,显然它没有被使用。
Here是Spring Data MongoDB针对相同问题(或非常接近我的问题)的问题。作者提供了解决方案,但我不知道这是否是唯一的方法。我想联系作者了解更多细节,但他们从那时起就不活跃了。
我可以从上面实现解决方案,但我想弄清楚到底是怎么回事。谢谢大家提前!
1条答案
按热度按时间hiz5n14c1#
进一步研究这个问题,我意外地找到了一个解决办法.
有Sping Boot Starter Spring Integration依赖项。但是,服务中没有使用任何来自Spring Integration的东西。
还有
Jackson2JsonObjectMapper
bean被定义了,但是没有在任何地方使用。很可能是服务早期阶段的遗留物。这里我应该注意到,有问题的数据类是由@JsonDeserializer
注解的,带有正确工作的特定反序列化器类。因此,删除bean和SpringIntegration依赖项可以解决这个问题。