Jackson 单参数构造函数因 ParameterNameModule 失败

2023-12-14

我正在使用 Jackson 2.8.5 和 Java 8 的 ParameterNamesModule (https://github.com/FasterXML/jackson-modules-java8).

当我想使用单个参数对具有单个构造函数的类进行反序列化时,我的问题对于一个用例来说非常具体。这是重现该行为的测试:

public class JacksonTest {

    @Test
    public void TestReadValue() throws IOException {
        ObjectMapper objectMapper = new ObjectMapper()
                .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
                .setVisibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.PUBLIC_ONLY)
                .registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES));

        ImmutableIdentity identity = objectMapper.readValue("{\"id\":\"ABCDEF\"}", ImmutableIdentity.class);

        assertEquals("ABCDEF", identity.id);
    }

    private static final class ImmutableIdentity {

        private final String id;

        public ImmutableIdentity(final String id) {
            Objects.requireNonNull(id, "The id must not be null.");

            this.id = id;
        }
    }

}

测试失败,原因:

com.fasterxml.jackson.databind.JsonMappingException:无法构造 JacksonTest$ImmutableIdentity 实例,问题: id 不能是 无效的。在[来源:{“id”:“ABCDEF”};行:1,列:15]

有趣的是,如果我向构造函数添加另一个参数,测试就可以通过。

public class JacksonTest {

    @Test
    public void TestReadValue() throws IOException {
        ObjectMapper objectMapper = new ObjectMapper()
                .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
                .setVisibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.PUBLIC_ONLY)
                .registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES));

        ImmutableIdentity identity = objectMapper.readValue("{\"id\":\"ABCDEF\"}", ImmutableIdentity.class);

        assertEquals("ABCDEF", identity.id);
    }

    private static final class ImmutableIdentity {

        private final String id;

        public ImmutableIdentity(final String id, **final String unused**) {
            Objects.requireNonNull(id, "The id must not be null.");

            this.id = id;
        }
    }

}

我真的不喜欢在构造函数中使用无用的参数来使其不那么模糊,因为它在我的业务对象中没有价值,特别是它们例如 ProjectId 或定义我的实体和我的一些抽象 Id也需要手动构建它们。所以我想找到一个杰克逊的配置来支持这一点,但我找不到。

我还在这里为维护者交叉发布:https://github.com/FasterXML/jackson-modules-java8/issues/8


你是否有机会编译JacksonTest with -parameters选项?如果是这样,这是预期的行为。 单参数构造函数历史上被用作委托创建者。 即使我们创建该模块时,我也已经与 @staxman 讨论过这个问题。不同用户多次出现该问题,请参阅这个问题了解详情。 展望未来,这有望在 3.0 中得到改变,请参阅这个话题了解详情。

更新:关于3.0的变更,请参见这个问题。如果您希望改变此行为,请添加 +1 或评论。目前尚不清楚这两种方法是否更好,因为有些用户需要旧的行为(有关更多详细信息,请参阅问题)。

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

Jackson 单参数构造函数因 ParameterNameModule 失败 的相关文章

随机推荐

  • 根据位置从字符串中删除字符

    有没有一种简单的方法可以从字符串中删除特定字符 在下面的示例中 我想从向量的每个元素中删除最后三个字符 string lt c Autauga AL Bald Win Av Barbour AL Bibb AL Blount At Bull
  • 填充曲线和对角线之间的区域

    你能帮我解决这个问题吗 我想知道如何填充曲线和对角线 连接 X min Y min 到 X max Y max 的线 之间的区域 例如 在下图中我们如何填充上面的区域红色对角线和蓝色下方的区域 提前感谢您的时间和考虑 import nump
  • 打开 js 变量的保存文件对话框

    在我的网络应用程序中 我需要为用户提供将 js 变量保存为文件的选项 当用户单击下载时 应用程序会要求他保存文件 最好是保存为 js 文件 与谷歌文档类似 您可以保存文件 javascript可以通过这种方式传递它的变量吗 查看下载这正是允
  • 在 Excel 中查找范围的第一个非空白单元格的标题索引的公式?

    我有这张表 可以将其视为基本的自定义甘特图 我想根据同一行范围内第一个填充的单元格及其相应列 第 1 行 的标题值 用开始日期填充 A 列 显示我的预期结果比实际编写更容易 非常感谢您的帮助 在A2中尝试复制这个公式 IF COUNTA B
  • 安卓支持所有屏幕尺寸吗?

    我知道这个问题已经被问过很多次了 但我找不到针对我的查询的最佳解决方案 我遵循了android开发者支持中给出的每一个步骤 支持多屏 将不同尺寸的图像放在不同的文件夹中 为设备屏幕制作不同的布局文件夹 但在 4 7 英寸到 5 0 英寸的设
  • JAXB - xsd:all 内具有无限 maxOccurs 的元素

    假设我有以下 java 类 该类映射到 REST 服务的请求主体以搜索用户 XmlRootElement name SearchParams XmlType propOrder public class SearchParams priva
  • 实体框架和自我跟踪实体与 POCO

    如果我想使用实体框架 4 作为我的数据层 并希望将我的实体发送到另一层 无论是通过 WCF 还是其他机制 然后希望能够更新实体并将它们发回以进行更新 删除 插入最好使用自跟踪实体还是 poco 对象 如果可能的话 我宁愿使用 POCO 对象
  • 在 ggplot 中绘制多个时间序列

    我有一个由 10 个变量组成的时间序列数据集 我想创建一个时间序列图 其中每个 10 个变量随着时间的推移以不同的颜色绘制在同一个图表上 值应位于 Y 轴上 日期应位于 X 轴上 点击这里对于数据集 csv 这是我一直在使用的 可能是错误的
  • 如何阅读这个 LESS css?

    我正在尝试找出 Joni Korpi 的 Frameless CSS 无框架网格 http framelessgrid com 并且我很难阅读他拥有的 less 文件 我对 LESS 使用变量有一个基本的了解 所以我知道 column 48
  • 安装 Windows 10 周年更新后无法启动 Android 模拟器

    我刚刚安装了 Windows 10 周年更新 现在无法启动 Android 模拟器 Android Studio 显示以下消息 Android Emulator is incompatible with Hyper V 但如下图所示 Hyp
  • 如何获取大型调查数据集的 svydb R 包以返回标准错误

    很高兴看到 Charco Hui 将 Thomas Lumley 的实验性 sqlsurvey 包复活为 svydb 在 R 中处理大型调查数据集可能是一个很好的工具 不过 在 svydb 计算标准误差时遇到了一些问题 这个问题与我在 sq
  • 尝试找到 4 个点的贝塞尔曲线的长度

    我找到了这个问题的大约 1000 个答案 但没有一个是我可以使用的 因为我在曲线中使用了 4 个控制点 也就是说 我偶然发现了这个人here double BezierArcLength point2d p1 point2d p2 poin
  • 播放案例类的json读取和默认参数?

    我对默认参数和使用 Play Json Read 有问题 这是我的代码 case class Test action String storeResult Option Boolean Some true returndata Option
  • 为 python 函数提供可变数量的参数

    我有一个脚本 它从输入文件中读取可变数量的字段并将它们作为参数传递给函数 例如 文件 1 包含字段 A B 和 C gt function A B C 文件 N 包含字段 A B C 和 D gt function A B C D 我的问题
  • 如何在 django 中使用 @ 提及用户

    我一直在 django 上开发一个项目 它与 instagram 和 twitter 非常相似 它需要具有的功能之一是在文本字段中使用 提及用户 我已经调查了一段时间 关于如何在 django 中做到这一点 除了一些像 django men
  • 如何在 tkinter Entry 小部件中仅插入一些指定的字符

    我有一个包含 n 个 Entry 小部件的列表 用户应该只能键入以下字符 V F 如果用户键入这些字符之一 则焦点应从 Entry x 传递到 Entry x 1 否则焦点应保留在原来的位置 在 Entry x 上 并且应丢弃输入 我无法丢
  • 如何在Java中递归解压文件?

    我有 zip 文件 其中包含一些其他 zip 文件 例如 邮件文件是abc zip它包含xyz zip class1 java class2 java And xyz zip包含文件class3 java and class4 java 所
  • 为第三方 Webflow 重定向 ionic 时要使用什么重定向 URL

    我正在开发一个离子移动应用程序 我想在其中重定向到第三方网络流 该网络流请求用户同意并重定向到回调 URL 我应该指定该回调 URL 以获取令牌作为权限令牌以进行进一步的 API 调用 由于 ionic 本身是一个 html5 移动应用程序
  • 为什么存在NotImplementedException?

    Locked 这个问题及其答案是locked因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 这真的非常让我感到不安 所以我希望有人能给我一个合理的理由来解释为什么事情是这样的 NotImplementedException
  • Jackson 单参数构造函数因 ParameterNameModule 失败

    我正在使用 Jackson 2 8 5 和 Java 8 的 ParameterNamesModule https github com FasterXML jackson modules java8 当我想使用单个参数对具有单个构造函数的