你好,Spring社区,
我有一个带有Mongo DB的Sping Boot 3应用程序。我使用Spring Data Mongo Reactive与数据库通信,除了这个问题,它工作得很好。
我有一个属性,我想封装与另一个类,但我需要相同的数据库结构的兼容性。
@Data
@Builder
@RequiredArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
public class TestType {
String value;
}
个字符
如果不使用转换器编写,则此代码将生成以下文档:
{
"id": someID,
"data": {},
"testType":{"value":"payload"}
}
型
但我需要它看起来像这样:
{
"id": someID,
"data": {},
"testType":"payload"
}
型
所以我添加了两个CustomConverters,并添加了一个bean来提供mongoCustomConversions:
@WritingConverter
public class TestTypeStringConverter implements Converter<TestType, String> {
@Override
public String convert(TestType source) {
return source.getValue();
}
}
@ReadingConverter
public class StringTestTypeConverter implements Converter<String, TestType> {
@Override
public TestType convert(@NonNull String source) {
return new TestType(source);
}
}
@Bean
public MongoCustomConversions mongoCustomConversions() {
return new MongoCustomConversions(List.of(
new TestTypeStringConverter(),
new StringTestTypeConverter()
));
}
我使用mongoTemplate将我的更改写入数据库:
private UpdateOneModel<Document> createUpdate(Entity newEntity) {
var query = new Query().addCriteria(new Criteria(UNDERSCORE_ID).is(newEntity.getId()));
var updateVehicle = new Update();
var options = new UpdateOptions();
options.upsert(true);
updateVehicle.set(Entity.Fields.data, newEntity.getData());
updateVehicle.set(Entity.Fields.testType, newEntity.getTestType());
return new UpdateOneModel<>(query.getQueryObject(), updateVehicle.getUpdateObject(), options);
}
private Mono<BulkWriteResult> execute(String collectionName, UpdateOneModel<Document> updateModelList) {
return reactiveMongoTemplate.getCollection(collectionName)
.flatMap(c -> Mono.from(c.bulkWrite(List.of(updateModelList))));
}
但是我的对象仍然被写为没有转换器。
MongoTemplate确认mongoTemplate包含我的转换器的示例。两者都分别列在转换器和writing-和readingPairs中。我尝试更改数据库,但也没有改变任何东西。在这一点上,我已经没有主意了。
我做错了什么?
感谢您的支持。
1条答案
按热度按时间y1aodyip1#
要执行upsert,您没有以正确的方式使用Spring。相反,您正在从com.mongodb包中调用
bulkWrite
方法。您正确定义的转换器是SpringData Mongo中的Spring概念。我使用了相同的reactiveMongoTemplate,但使用了SpringData Mongo中的upsert方法,它按预期工作。我在这里做了一个提交的例子:https://github.com/sbernardo/spring-issues-examples/tree/main/sof-questions-77612149
无论如何,你仍然可以使用你目前的方法进行批量操作(你可以在我的代码库中找到这段代码):
字符串
我用的是spring-boot 3.2.0和java 21。