spring CustomConverter不适用于ReactiveMongoTemplate

bjg7j2ky  于 5个月前  发布在  Spring
关注(0)|答案(1)|浏览(70)

你好,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中。我尝试更改数据库,但也没有改变任何东西。在这一点上,我已经没有主意了。
我做错了什么?
感谢您的支持。

y1aodyip

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
无论如何,你仍然可以使用你目前的方法进行批量操作(你可以在我的代码库中找到这段代码):

var entity = new Entity(UUID.fromString("7f6a35fb-a449-4e31-b9c1-7592cc969d83"), new TestType("HelloValue"));

Update update = new Update();
update.set(Entity.Fields.testType, entity.getTestType());
update.set("field2", "otherFieldValue");

return reactiveMongoTemplate
        .bulkOps(BulkOperations.BulkMode.UNORDERED, Entity.class)
        .upsert(Query.query(new Criteria(UNDERSCORE_ID).is(entity.getId())), update)
        .execute()
        .block()
        .toString();

字符串
我用的是spring-boot 3.2.0和java 21。

相关问题