当前位置: 首页 > 面试题库 >

泽西岛:找不到适合类型[简单类型,类Thing]的构造函数:无法从JSON对象实例化

哈和惬
2023-03-14
问题内容

我有一种方法的资源:

@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/add")
public Response putThing(Thing thing) {
    try {
        //Do something with Thing object
        return Response.status(HttpStatus.SC_OK).build();
    } catch (Exception e) {
        log.error("Request failed", e);
        return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
    }
}

事情:

public class Thing {
    private final String symbol;
    private final String name;

    public Stock(String symbol, String name) {
        this.symbol = symbol;
        this.name = name;
    }

    public String getSymbol() {
        return this.symbol;
    }

    public String getName() {
        return this.name;
    }
}

当我发出如下PUT请求时:

PUT /rest/add HTTP/1.1
Host: localhost:8135
Content-Type: application/json
Cache-Control: no-cache

{"symbol":"some symbol","name":"some name"}

我得到以下回应:

找不到适合类型[简单类型,类Thing]的构造函数:无法从JSON对象实例化(缺少默认构造函数或创建者,或者可能需要添加/启用类型信息?)

为什么Jersey / Jackson不将JSON对象反序列化到POJO中?


问题答案:

您需要一个无参数的构造函数和setter或使用@JsonCreator。最简单的方法就是添加带有setter的no-
arg。反序列化时,杰克逊需要二传手。对于序列化,只需要使用吸气剂即可。

编辑

要使其保持不变,可以@JsonCreator在构造函数上使用。例如

@JsonCreator
public Thing(@JsonProperty("symbol") String symbol, 
             @JsonProperty("name") String name) {

    this.symbol = symbol;
    this.name = name;
}

查看更多杰克逊注释:@JsonCreator揭秘



 类似资料: