Jackson 无法识别 @JsonCreator 注释

js

1个回答

写回答

二世

2025-07-09 22:00

+ 关注

Java
Java

Jackson 是一个流行的 Java 库,用于处理 JSON 数据。它提供了许多方便的功能,如将 Java 对象转换为 JSON 字符串,以及将 JSON 字符串转换为 Java 对象。然而,最近发现 Jackson 无法正确识别使用 @JSonCreator 注释的情况。本文将探讨这个问题,并提供解决方案。

在 Java 中,@JSonCreator 注释用于标记一个构造函数,指示 Jackson 应该使用该构造函数来创建对象。这对于处理复杂的 JSON 结构非常有用,因为它允许我们在创建对象时执行一些逻辑。然而,最近的报告表明,当使用 @JSonCreator 注释时,Jackson 无法正确地识别构造函数。

为了更好地理解这个问题,让我们看一个示例代码。假设我们有一个简单的 Java 类,表示一个用户的姓名和年龄:

Java

public class User {

private String name;

private int age;

@JSonCreator

public User(@JSonProperty("name") String name, @JSonProperty("age") int age) {

this.name = name;

this.age = age;

}

// Getters and setters

}

在上面的代码中,我们使用 @JSonCreator 注释标记了 User 类的构造函数,并使用 @JSonProperty 注释指定了 JSON 字段的名称。这样,当我们将 JSON 字符串转换为 User 对象时,Jackson 应该使用该构造函数来创建对象。

然而,当我们尝试使用 Jackson 将以下 JSON 字符串转换为 User 对象时,会出现问题:

JSon

{

"name": "John",

"age": 25

}

我们可以使用以下代码来执行转换:

Java

ObjectMapper mapper = new ObjectMapper();

User user = mapper.readValue(JSonString, User.class);

但是,当我们运行上述代码时,会抛出一个异常,指示 Jackson 无法找到合适的构造函数:

com.fasterXML.jackson.databind.exc.MismatchedInputException: Cannot construct instance of <code>User</code> (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)

为了解决这个问题,我们需要采取一些额外的步骤。让我们在下一节中讨论解决方案。

解决方案:使用 @JSonCreator 注释的替代方法

为了绕过 Jackson 无法识别 @JSonCreator 注释的问题,我们可以使用另一种方法来创建对象。我们可以在类中添加一个静态的工厂方法,并使用 @JSonCreator 注释标记该方法。让我们修改上面的示例代码来使用这种方法:

Java

public class User {

private String name;

private int age;

private User(String name, int age) {

this.name = name;

this.age = age;

}

@JSonCreator

public static User createUser(@JSonProperty("name") String name, @JSonProperty("age") int age) {

return new User(name, age);

}

// Getters and setters

}

在上述代码中,我们将原来的构造函数改为私有,并添加了一个名为 createUser 的静态工厂方法。我们将 @JSonCreator 注释添加到该方法上,并使用 @JSonProperty 注释指定 JSON 字段的名称。

现在,当我们尝试使用 Jackson 将 JSON 字符串转换为 User 对象时,它将使用静态工厂方法来创建对象:

Java

ObjectMapper mapper = new ObjectMapper();

User user = mapper.readValue(JSonString, User.class);

通过这种方式,我们可以绕过 Jackson 无法识别 @JSonCreator 注释的问题,并成功地将 JSON 字符串转换为 User 对象。

Jackson 是一个强大的 Java 库,用于处理 JSON 数据。尽管它提供了许多方便的功能,但最近发现了一个问题:Jackson 无法识别带有 @JSonCreator 注释的构造函数。为了解决这个问题,我们可以使用静态工厂方法并将其标记为 @JSonCreator 注释的替代方法。这样,我们可以成功地将 JSON 字符串转换为 Java 对象。

希望本文对于遇到这个问题的开发人员有所帮助。如果你正在使用 Jackson,并且遇到了类似的问题,希望本文提供的解决方案能解决你的困扰。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号