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

2024-01-09

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

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


以下是我们解决这个问题的方法(最终结果是 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);

    }
}

以及编解码器本身:

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;
    }
}

当与 Lombok 和最新的 Jackson 注释结合使用时,它允许我们做这样的事情(看起来几乎不像 Java 代码,是吗?):

@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 {
    }

}

Then:

Account account = collection.find(eq("_id", id)).first();
System.out.println(account.getOrganizationName());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法自动创建 Mongo 编解码器? 的相关文章

随机推荐

  • 如何在发布模式下调试

    有没有办法在 Xamarin 中以发布模式调试应用程序 当我在发布模式下开始调试时 它只运行应用程序而不启动调试器 我问这个问题 因为应用程序在调试器模式下工作 但在发布模式下崩溃 确实没有充分的理由debug in a Release配置
  • Android更改listview项目文本颜色

    我正在尝试根据 flag 更改列表视图中的某些项目文本颜色 或背景颜色 经过长时间的搜索 我没有找到如何做到这一点 我在特定操作后调用以下循环来更改颜色 ListView listView ListView findViewById R i
  • 如何使用rack-mini-profiler 分析返回json 响应的rails 控制器?

    我在 Rails 3 2 项目中使用rack mini profiler 在宝石文件中 gem rack mini profiler 一切都很好 但我的应用程序主要是一组 json 端点 因此 虽然能够检查 html 页面的性能非常有用 但
  • 使用 JavaScript 生成 RSA 密钥?

    有没有办法使用 JavaScript 生成私钥和公钥 我需要数据库中的这些密钥 开始 RSA 私钥 MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQ WMNW6
  • 通过外部实体在刷新时例外的 Doctrine OneToOne 身份

    I have User and UserProfileOneToOne 相关的 Doctrine ORM 实体 他们应该永远成对存在 不应该有User没有UserProfile User 应该从自动增量中获取其 id 而 UserProfi
  • 如何使用社区服务器连接器扩展在 VSC 上启动 Tomcat 8.5 服务器

    我正在尝试在 VSC 上设置 Tomcat 服务器 因为它无法在 IntelliJ 上运行 因为我没有终极版本 但我没有使用 Community Server Connector 的经验 我的同事也没有 我们所有的文档都是为 Tomcat
  • 缺少 Maven 插件 Jetty

    我在执行此操作时遇到问题http hrycan com 2012 03 28 primefaces lazy loading datatable for jsf2 http hrycan com 2012 03 28 primefaces
  • 来自共享或操作扩展 ios 的网络请求

    我已经搜索过这个标题 但没有找到任何合适的信息 我找到了发出网络请求的方法 将其结果发送到包含应用程序的应用程序 但是 我想直接得到分机的响应并在那里显示信息 我遇到过一些使用 javascript 访问网页的方法 但没有向后端发出请求 是
  • 如何用javascript从pdf文件中提取文本? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 所以我想知道是否有一种方法可以在javascript中从pdf中提取文本 我已经调查了一些 npm 模块 例如 PDF TO TEXT
  • 如何在Windows不分配驱动器号的情况下创建分区?

    我正在尝试通过 Windows API 对附加的虚拟硬盘进行初始化和分区 我已经成功使用设备Io控制 http msdn microsoft com en us library windows desktop aa363216 28v vs
  • Google Adwords CSP(内容安全政策)img-src

    中包含哪些域 协议img src是否需要 Content Security Policy 标头指令才能允许 Google AdWords 转化跟踪 从测试来看 当我们打电话时google trackConversion 看起来浏览器会创建一
  • JDK16 和 Mac OS 上的 Mockito - 无法初始化插件

    java lang IllegalStateException Could not initialize plugin interface org mockito plugins MockMaker alternate null Cause
  • 测试 angular2 dart 组件

    我写了一个组件并想测试它 如何从组件编写测试 有没有 Angular dart 的测试框架 您可以使用test https pub dartlang org packages test包含实验测试实现的包https github com d
  • 防止我的nodejs服务器中的xhr攻击[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在开发一个将与客户端移动应用程序
  • Redux 中间件工作一半,但未完全取消操作

    我有一些简单的中间件 可以工作 但也不能工作 基本上我有一个用户列表 我正在尝试删除一个 然后与 firebase 同步 一切都很好 我添加了一些中间件 以便当用户删除一个中间件时 它会询问您是否确定 只需使用一个简单的alert目前 如果
  • 基于 WPF DataGrid 中的 DataGridTemplateColumn 设置列样式

    我正在使用 WPF DataGrid 其中如果该行可编辑 其中一列需要显示 编辑 超链接 这由该行的支持模型中的布尔标志指示 我能够使用 DataGridTemplateColumn 实现这一点 没有问题 然而 对整行的附加要求是在选择该行
  • 使按钮在鼠标悬停时透明

    我正在使用 Microsoft Visual Studio Express 2012 构建 Metro 风格应用程序 我对此应用程序非常陌生 需要帮助 我在 XAML 中定义了一个按钮 按钮背景是从图像设置的 将鼠标悬停在按钮上时 会将其背
  • 错误 Microsoft.Web.Infrastruct,版本 = 1.0.0.0,文化 = 中性,PublicKeyToken = 31bf3856ad364e35

    我有一个小型网络应用程序 在我在应用程序中添加两个 genericHandler 之前 它工作得很好 我对 http 处理程序进行了以下更改
  • 在Python中从操作系统生成一个随机单词

    我正在用 Python 创建一个刽子手游戏 我希望能够生成一个随机单词 我总是可以列出一个列表 但如果可能的话 我希望不必手动写下所有单词 Python 中有函数 读取内置 MacOS 字典的方法吗 Thanks 大多数 Unix 类似 系
  • 有没有办法自动创建 Mongo 编解码器?

    我愿意将我的代码从 mongojack 迁移到支持新的异步 mongo 驱动程序的代码 然而我发现新的编码 解码方式是通过Codec我不认为自己在写Codec对于我的模型中的每个类 这就是为什么我宁愿编写一个库 给定一个类创建一个Codec