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

我有一个资源,方法如下:

@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"}

我得到以下回应:

No suitable constructor found for type [simple type, class Thing]: can
not instantiate from JSON object (missing default constructor or
creator, or perhaps need to add/enable type information?)

为什么泽西/杰克逊不将我的JSON对象反序列入我的POJO?

最佳答案
您需要一个无参数构造函数和setter,或者使用@JsonCreator。最简单的做法就是添加no-arg与setter。当反序列化时,杰克逊需要设置者。为了序列化,所有需要的是getter。

编辑

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

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

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

查看更多Jackson Annotations: @JsonCreator demystified

转载注明原文:java – 泽西:找不到适合的类型[简单类型,类Thing]的构造函数:无法从JSON对象中实例化 - 代码日志