首页 > 解决方案 > “冲突的字符串创建者:已经明确标记...”;创建者在哪里明确标记?

问题描述

我是 Jackson 的新手,在尝试使用 ObjectMapper.readValue 反序列化 POJO 时看到这些错误:

冲突的字符串创建者:已经明确标记了 [方法 CLASSNAME#fromString(1 参数)],遇到了 [方法 CLASSNAME#valueOf(1 参数)]

fromString 和 valueOf 都是具有相同签名的静态工厂方法。

我不能轻易删除一个或另一个,因为依赖项已经在使用两者,尽管对于我正在测试的代码路径,如果我只删除 valueOf 它确实有效。如前所述,如果这不是永久解决方案,我更愿意。

这两种方法都没有使用@JsonCreator 注释,并且添加@JsonCreator 并正确注释参数会产生相同的错误。

由于我看不到任何一个函数是如何被显式标记的(因为我知道的唯一方法是@JsonCreator),为什么会发生这个错误,或者它们还能在哪里“显式标记”?是否可以同时拥有两者但只使用一个进行反序列化?

标签: javajackson

解决方案


我从来没有想出我的第一个问题的答案,但我设法通过将可变参数添加到我的第二个函数和故障安全来回答第二个问题,但实际上并没有让用户添加额外参数的异常。这只是为了更改方法签名。

前:

public static String fromString(String arg) throws Exception { ... }
public static String valueOf(String arg) throws Exception { ... }

后:

public static String fromString(String arg) throws Exception { ... }
public static String valueOf(String arg, Object... varargs) throws Exception {
    if (varargs.length > 0) {
        throw new IllegalArgumentException("Don't use these");
    }
...
}

推荐阅读