Java 有没有办法自动创建Mongo编解码器?

Java 有没有办法自动创建Mongo编解码器?,java,mongodb,asynchronous,codec,Java,Mongodb,Asynchronous,Codec,我愿意将我的代码从mongojack迁移到支持新的异步mongo驱动程序的地方。然而,我发现新的编码/解码方式是通过Codecs,我并不认为自己为模型中的每个类都编写了Codec。这就是为什么我宁愿编写一个lib,让给定的类创建一个Codec。然而,我不知道如何,也不知道是否已经有一些努力试图实现同样的目标。 是否有一些LIB可以实现我想要的?如果没有,实现它的最佳方法是什么 (我知道我可能应该在那里的某个地方使用codeprovider,但我仍然不知道从哪里开始)是的,如果你使用Jackson

我愿意将我的代码从mongojack迁移到支持新的异步mongo驱动程序的地方。然而,我发现新的编码/解码方式是通过
Codec
s,我并不认为自己为模型中的每个类都编写了
Codec
。这就是为什么我宁愿编写一个lib,让给定的类创建一个
Codec
。然而,我不知道如何,也不知道是否已经有一些努力试图实现同样的目标。 是否有一些LIB可以实现我想要的?如果没有,实现它的最佳方法是什么


(我知道我可能应该在那里的某个地方使用
codeprovider
,但我仍然不知道从哪里开始)

是的,如果你使用Jackson,你可以使用mongo-Jackson编解码器,它会自动为你处理。

以下是我们解决这个问题的方法(最终结果是Lombok、Jackson和MongoDB之间的超级流畅):

提供者:

public class JacksonCodecProvider implements CodecProvider {
    private final ObjectMapper objectMapper;

    public JacksonCodecProvider(final ObjectMapper bsonObjectMapper) {
        this.objectMapper = bsonObjectMapper;
    }

    @Override
    public <T> Codec<T> get(final Class<T> type, final CodecRegistry registry) {

            return new JacksonCodec<>(objectMapper, registry, type);

    }
}
然后:


我不确定编解码器是做什么的,但是你看过Spring数据映射器吗?我确实看过,但这不是我需要的。新的mongo java驱动程序(版本3+)使我们有机会通过编解码器直接解析对域类的响应,而无需使用中间表示(DBObject)。但是你必须自己写()。我正在寻找自动编写这些编解码器的库,因此我不必手动编写。警告:截至本文撰写之时(2016-10-04),该mongo-jackson编解码器库存在严重缺陷,因为它只能通过完整文档弥合mongo编解码器和jackson之间的差距,即,它无法在根级别序列化非文档BSON值。在
find
update
命令(使用本机Mongo java驱动程序时)中构建查询
Bson
文档时,尝试使用Jackson编解码器序列化
java.time.Instant
等值时,这一限制将发挥作用。这对我来说非常有效。这不是一个通过Maven打包和分发的好选择吗?我还没有找到一个可用的等价物。
class JacksonCodec<T> implements Codec<T> {
    private final ObjectMapper objectMapper;
    private final Codec<RawBsonDocument> rawBsonDocumentCodec;
    private final Class<T> type;

    public JacksonCodec(ObjectMapper objectMapper,
                        CodecRegistry codecRegistry,
                        Class<T> type) {
        this.objectMapper = objectMapper;
        this.rawBsonDocumentCodec = codecRegistry.get(RawBsonDocument.class);
        this.type = type;
    }

    @Override
    public T decode(BsonReader reader, DecoderContext decoderContext) {
        try {

            RawBsonDocument document = rawBsonDocumentCodec.decode(reader, decoderContext);
            String json = document.toJson();
            return objectMapper.readValue(json, type);
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }

    @Override
    public void encode(BsonWriter writer, Object value, EncoderContext encoderContext) {
        try {

            String json = objectMapper.writeValueAsString(value);

            rawBsonDocumentCodec.encode(writer, RawBsonDocument.parse(json), encoderContext);

        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }

    @Override
    public Class<T> getEncoderClass() {
        return this.type;
    }
}
@JsonIgnoreProperties(ignoreUnknown=true)
@JsonDeserialize(builder = Account.AccountBuilder.class)
@Builder(toBuilder=true)
@Value
public class Account {

    @JsonProperty private String _id;
    @JsonProperty private long _version;
    @JsonProperty private String organizationName;

    @JsonPOJOBuilder(withPrefix = "")
    public static final class AccountBuilder {
    }

}
Account account = collection.find(eq("_id", id)).first();
System.out.println(account.getOrganizationName());