如何将 java.util.Optional 与 REST API 一起使用?

2024-05-04

我有一堂课看起来像

public class ActiveDirectorySetup implements Serializable {
  private ActiveDirectoryDataSource activeDirectoryDataSource;
  private Optional<ShActiveDirectorySettings> shActiveDirectorySettings;
  private Optional<SaActiveDirectorySettings> saActiveDirectorySettings;
 // ...
}

我通过 API 将其发送为

      Optional<ActiveDirectoryConfiguration> configuration = store.getConfiguration();
      if (configuration.isPresent()) {
        return configuration.get();
      }

我在浏览器上看到的是

[
   {
      "activeDirectoryDataSource":{
         "host":"localhost",
         "port":0,
         "userName":"user",
         "password":"password",
         "activeDirectoryQueryConfig":{
            "base":{
               "present":false
            },
            "filter":"filter",
            "attributes":[

            ]
         },
         "activeDirectorySslSettings":{
            "present":false
         }
      },
      "shActiveDirectorySettings":{
         "present":true
      },
      "saActiveDirectorySettings":{
         "present":true
      }
   }
]

对于看起来像这样的有效负载

{
    "activeDirectorySetups": [
        {
            "activeDirectoryDataSource": {
                "host": "localhost",
                "port": 0,
                "userName": "user",
                "password": "password",
                "activeDirectoryQueryConfig": {
                    "base": null,
                    "filter": "filter",
                    "attributes": []
                },
                "activeDirectorySslSettings": null
            },
            "shActiveDirectorySettings": {
                "enableUserMapping": true,
                "attributes": null
            },
            "saActiveDirectorySettings": null
        }
    ]
}

正如你所看到的,我得到{"present":true}而不是实际值。

我在用杰克逊数据类型-jdk8 https://github.com/FasterXML/jackson-datatype-jdk8为了这项工作。我怎样才能强制它更换{"present":true}与实际值 - 要么null or {"enableUserMapping": true, "attributes": null}


我很确定您需要为此编写自定义序列化/反序列化功能。

解串器

public class OptionalDeserializer<T> extends StdDeserializer<Optional<T>> {

    private ObjectMapper customObjectMapper;

    private Class<T> type;

    /**
     * @param customObjectMapper any ObjectMapper, possibly with deserialization logic for the wrapped type
     * @param type the wrapped type
     */
    public OptionalDeserializer(ObjectMapper customObjectMapper, Class<T> type) {
        this(Optional.class);
        this.customObjectMapper = customObjectMapper;
        this.type = type;
    }

    // At least one type-based constructor is required by Jackson
    private OptionalDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public Optional<T> deserialize(JsonParser jsonParser, DeserializationContext ctx) throws IOException {
        // Read entire tree
        JsonNode treeNode = jsonParser.getCodec().readTree(jsonParser);

        // Check if "present" is true
        if (treeNode.has("present") && treeNode.get("present").asBoolean()) {
            // Read your wrapped value
            return Optional.of(customObjectMapper.treeToValue(treeNode.get("data"), type));
        }

        // Return empty() by default
        return Optional.empty();
    }
}

串行器

请注意,您可以包含自定义ObjectMapper为了Box在管道中的任意位置键入。为了简单起见,它在序列化器中被省略。

public class OptionalSerializer<T> extends StdSerializer<Optional<T>> {

    public OptionalSerializer(Class<T> type) {
        this(TypeFactory.defaultInstance().constructParametricType(Optional.class, type));
    }

    protected OptionalSerializer(JavaType javaType) {
        super(javaType);
    }

    @Override
    public void serialize(Optional<T> value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeStartObject();
        if (value.isPresent()) {
            gen.writeBooleanField("present", true);
            gen.writeObjectField("data", value.get());
        } else {
            gen.writeBooleanField("present", false);
        }
        gen.writeEndObject();
    }
}

用法示例:

public static void main(String[] args) throws IOException {
    ObjectMapper optionalMapper = new ObjectMapper();

    SimpleModule module = new SimpleModule();
    // Add any custom deserialization logic for Box objects to this mapper
    ObjectMapper boxMapper = new ObjectMapper();
    OptionalDeserializer<Box> boxOptionalDeserializer = new OptionalDeserializer<>(boxMapper, Box.class);
    OptionalSerializer<Box> boxOptionalSerializer = new OptionalSerializer<>(Box.class);
    module.addDeserializer(Optional.class, boxOptionalDeserializer);
    // use addSerializer(JsonSerializer<?> ser), not addSerializer(Class<? extends T> type, JsonSerializer<T> ser)
    // The generic types involved here will otherwise not let the program compile
    module.addSerializer(boxOptionalSerializer);
    optionalMapper.registerModule(module);

    String json = "{\"present\": true, \"data\": {\"myValue\": 123}}";
    Optional optional = optionalMapper.readValue(json, Optional.class);

    @SuppressWarnings("unchecked") // Guaranteed safe cast
    Optional<Box> boxOptional = (Optional<Box>) optional;

    // Prints "123"
    boxOptional.ifPresent(box -> System.out.println(box.getMyValue()));

    // Prints the contents of "json" (variable defined above)
    System.out.println(optionalMapper.writeValueAsString(boxOptional));
}

Where Box只是一个简单的示例类:

private static class Box {
    private int myValue;

    public int getMyValue() {
        return myValue;
    }

    public void setMyValue(int myValue) {
        this.myValue = myValue;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 java.util.Optional 与 REST API 一起使用? 的相关文章

  • 无法使用 json 架构验证器根据预定义的 yaml 文件验证查询参数

    我需要根据预定义的 yaml 文件架构验证查询参数的架构 因此我使用 json 架构验证器 验证如何失败 我正在执行以下步骤 填充参数和相应的架构 final List
  • 如何在远程 WebSphere 上进行 JNDI 查找期间解决 sun/io/MalformedInputException

    我使用 WebSphere 8 5 来托管我的应用程序 并在应用程序服务器上配置了一些 JDBC 资源 我还使用瘦客户端运行时库开发了一个客户端应用程序 当按以下方式执行 JNDI 查找时 env put Context INITIAL C
  • 哪个 Swing 布局管理器可以获得我想要的布局?

    我正在尝试按照这个模型制作一个基本的登录菜单 我决定将整个菜单放入 JPanel 中 以便在连接成功后我可以切换到另一个面板 所以我决定使用 Borderlayout 将标题放在北区 将连接按钮放在南区 我将边框布局的中心本身设置为面板 我
  • RMI 中的引用传递问题? [复制]

    这个问题在这里已经有答案了 有人可以告诉我我错在哪里 为什么这个 RMI 聊天应用程序不起作用 目标是通过远程对象或序列化对象实现客户端 服务器和逻辑之间的解耦 import javax swing import java awt even
  • 请参阅 Java EE eclipse 调试中的 POST 参数

    我在调试 Java EE 方面没有经验 我更像是一个 javascript 人 我需要查看哪些 HTTP POST 参数到达服务器端 我在表单将其操作指向的 jsp 文件中放置了一个断点 现在我在调试变量窗口中找不到 POST 内容 他们在
  • 正则表达式获取字符串中的第一个数字和其他字符

    我是正则表达式的新手 想知道如何才能只获取字符串中的第一个数字 例如100 2011 10 20 14 28 55 在这种情况下 我希望它返回100 但该数字也可以更短或更长 我在想类似的事情 0 9 但它单独获取每个数字 100 2001
  • 字符串池可以包含两个具有相同值的字符串吗? [复制]

    这个问题在这里已经有答案了 字符串池可以包含两个具有相同值的字符串吗 String str abc String str1 new String abc Will the second statement with new operator
  • Java Microsoft Excel API [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何导入 org.apache.commons.lang3.ArrayUtils;进入 Eclipse [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我如何导入 org apache commons lang3 ArrayUtils 将库添加到 Ecl
  • 如何在 select 和 option 标签中添加 JSON 数据?

    我有这个html代码 div class searchfilter div class searchwrapper div div
  • Jenkins 的代码覆盖率 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 当您在数组列表上调用remove(object o)时,它如何比较对象?

    当您在 java 中的数组列表上调用remove object o 时 它如何比较对象以找到要删除的正确对象 它使用指针吗 或者它使用 Comparable 接口来比较对象吗 ArrayList remove 依赖于对象的实现Equal方法
  • 改变for循环的顺序?

    我遇到一种情况 我需要根据用户输入以不同的顺序循环遍历 xyz 坐标 所以我是 3D 空间中的一个区域 然后是一组像这样的 for 循环 for int x 0 x lt build getWidth x for int y 0 y lt
  • 了解 Spark 中的 DAG

    问题是我有以下 DAG 我认为当需要洗牌时 火花将工作划分为不同的阶段 考虑阶段 0 和阶段 1 有些操作不需要洗牌 那么为什么 Spark 将它们分成不同的阶段呢 我认为跨分区的实际数据移动应该发生在第 2 阶段 因为这里我们需要cogr
  • 使用 secp256r1 曲线和 SHA256 算法生成 ECDSA 签名 - BouncyCastle

    我正在尝试使用带有 secp256r1 曲线 P256 的 ECDSA 和用于消息哈希的 SHA256 算法生成签名 我也在使用 Bouncy Castle 库 下面的代码 public class MyTest param args pu
  • 使用 JAD 反编译 java - 限制

    我正在尝试使用 Java 中的 JAD 反编译几个 jar 文件 我也尝试过 JD GUI 但运气更差 但出现了很多错误 一种类型 易于修复 似乎是内部类 但我也发现了这段代码 static int SWITCH TABLE atp com
  • 春季 CORS。在允许的来源中添加模式

    查看CORS的弹簧指南 以下代码启用所有允许的来源 public class MyWebMVCConfigurer extends WebMvcConfigurerAdapter Override public void addCorsMa
  • 防止Java实例化的正确方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么应该首选 Java 类的接口?

    PMD https pmd github io 将举报以下违规行为 ArrayList list new ArrayList 违规行为是 避免使用 ArrayList 等实现类型 而是使用接口 以下行将纠正违规行为 List list ne
  • jolt变换后json对象的排序

    Input The input json object 所需输出 Event1 Value1 Event2 collection of json objects Event3 The input json object 所以基本上输入 js

随机推荐

  • Python pycrypto 模块:为什么 simplejson 无法转储加密字符串?

    表明统一码错误 utf8 codec can t decode byte 0x82 in position 0 unexpected code byte 这是代码 from Crypto Cipher import AES import s
  • 包含脱机 HTML 的 Visual Studio Code 扩展

    VSCode 扩展是否可以包含在安装扩展时写入磁盘某处 无论在哪里 的 HTML 以便我可以从链接打开该 HTML 例如 我想要在其工具提示中提供指向某个函数的离线文档的链接 是的 您的扩展可以使用标准节点 api 来下载文件 然后你可以
  • 0x800a138f - JavaScript 运行时错误:无法获取未定义或 null 引用的属性“值”

    我编写了一段 JavaScript 代码来比较 2 个文本框中的 2 个日期 function CompareDates var fdate document getElementById txtFromDate var edate doc
  • AZURE:workerrole 中的异步 Run()

    我有一个异步任务 async Task UploadFiles 我想在 azure 工作者角色的 Run 方法中调用 UploadFiles 上的 等待 但 await 仅适用于声明为异步的方法 那么我可以使 Run 方法异步 如下所示 p
  • django celery - 如何将 request.FILES['photo'] 发送到任务

    我正在尝试通过以下方式将 request FILES photo 从我的网站上传的文件 发送到 tCelery tasks upload photos delay img request FILES photo 我收到 pickle 错误
  • 使用 PowerShell 在 IIS FTP 站点上设置权限和设置

    我是 PowerShell 的初学者 我尝试了这个脚本并且运行良好 但我需要将 FTP 授权规则更改为 所有用户 读 写 并将 FTP 用户隔离 更改为 用户名目录 NEEDED FOR IIS CMDLETS Import Module
  • 尝试在 Spring MVC 中使用 OAuth 保护资源

    我们已经在 Spring MVC 上使用 Java 编写了 REST Web 服务 我一直在努力保护它们 OAuth 服务器在另一个网站中实现 该网站处理登录和访问令牌的创建 因此 在允许用户访问网络服务之前 我需要验证访问令牌是否正确 然
  • 如何在java中定期刷新ZipOutputStream

    我正在尝试以 zip 格式存档文件列表 然后即时为用户下载 我在下载 1GB 大小的 zip 时遇到内存不足问题 请帮助我如何在不增加 jvm 堆大小的情况下解决此问题 我想定期冲洗流 我正在尝试定期冲洗 但这对我不起作用 请在下面找到我的
  • 尝试在写入事务之外修改对象

    所以我不知道为什么会出现这个错误 错误信息如下 由于未捕获的异常 RLMException 而终止应用程序 原因 尝试在写入事务之外修改对象 首先在 RLMRealm 实例上调用 beginWriteTransaction 首先抛出调用堆栈
  • ECB、CBC、CFB哪种加密模式

    我的 php 脚本和 c 应用程序将相互传递一个 32 个字符长的哈希字符串 最佳模式是什么 我想到了 ECB 但我不确定 因为它说如果使用超过 1 个区块就不要使用 我如何知道该块有多大 他们偶尔会传递一个大文本文件 这将是加密此 CBC
  • 提交后清除 React 中的表单

    我试图在使用 Axios 创建表单提交后清除表单数据 消息处理良好 响应记录到页面 但每个文本字段中的数据在提交后仍保留在页面上 我尝试添加一个resetForm函数 我将表单设置回原来的空白状态 但这不起作用 import React C
  • Zend Framework 2 一个布局中有两个模板?

    在我的应用程序的每个模块中 我将有一个主要内容部分和一个侧边栏菜单 在我的布局中 我有以下内容 div class span8 listings div div class span4 div 我的控制器都返回一个指定内容的 ViewMod
  • Python 正则表达式 findall

    我正在尝试使用 Python 2 7 2 中的正则表达式从字符串中提取所有出现的标记单词 或者简单地说 我想提取其中的每一段文本 p p 标签 这是我的尝试 regex ur u005B1P u005D u005B u002FP u005D
  • 映射多个参数,其中一个参数是常量(数据)

    我正在努力在我构建的函数上使用 mapply 因为我在一个更大的环境中编程 所以我需要一个或多个参数 例如 如果我编写一个函数 其中一个参数是data fun test lt function data col val1 val2 retu
  • 用 pandas 查找树中叶节点的所有祖先

    我有一个表 有两列 父 和 子 这是从 SAP ERP 下载的 SETNODE 表 需要在 python 中创建一个数据框 其中每个级别作为其自己的列 相对于其父级和之前的所有级别 在Python 3 中 完整关系的级别数量未知 或始终变化
  • Qt 对象的生命周期

    Qt 对象的生命周期是多少 Such as QTcpSocket socket new QTcpSocket 套接字什么时候会被销毁 我应该使用 delete socket 有什么区别吗 QTcpSocket socket 我找不到有关此的
  • 当外部 div 动画时,Div 内的 Div 隐藏

    我有一个高度为 0 的父 div 和一个子 div 但在顶部使用 z index 我想要这个子 div 在单击时扩展父 div 的高度 效果确实很好 但是内部 div 消失在与父 div 平行的其他 div 后面 当动画完成时 它会再次显示
  • 无法读取文件内容

    我正在尝试读取文件的内容 releaseNotesPath System DefaultWorkingDirectory ccp develop ccp ccp ReleaseNotes ReleaseNotes latestRelease
  • 无法解析类型 android.support.v4.app.Fragment。它是从所需的 .class 文件间接引用的,Facebook [重复]

    这个问题在这里已经有答案了 我想在 Facebook 中发布照片和文本 为此我使用了来自 Facebook 参考站点的以下代码 https developers facebook com docs android link to your
  • 如何将 java.util.Optional 与 REST API 一起使用?

    我有一堂课看起来像 public class ActiveDirectorySetup implements Serializable private ActiveDirectoryDataSource activeDirectoryDat