Jersey:找不到类型[simple type,class Thing]的合适构造函数:无法从JSON对象实例化

时间:2015-06-27 22:55:43

标签: java jersey jackson jersey-2.0

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

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 /rest/add HTTP/1.1
Host: localhost:8135
Content-Type: application/json
Cache-Control: no-cache

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

当我发出PUT请求时:

xy_chart.render_to_file('test.svg')

我收到以下回复:

  

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

为什么Jersey / Jackson没有将我的JSON对象反序列化为我的POJO?

2 个答案:

答案 0 :(得分:36)

您需要一个no-arg构造函数和setter,或者使用(function () { /* Watching Eyes 2001 - kurt.grigg@yahoo.co.uk (Updated) */ var eye = 60; //Eye size in pixels if (eye % 2 == 0){ eye++; } var eye5 = eye / 2 | 0; var pup = 42 * eye / 100; if (pup % 2 == 0){ pup++; } var pup5 = (pup - 1) / 2; if (pup5 % 2 == 1){ pup5++; } var grng = (eye - pup) / 2; if (grng % 2 == 1){ grng++; } var rng = eye5 / grng; var p1, p2, osy, osx, yec, xec, d1, d2, a1, a2, le, re; var ros = eye + 2; var pix = 'px'; var d = document; var cstyle = 'position:relative;width:'+(ros*2)+'px;height:'+ros+'px;' +'margin:0px;border:none;padding:0px;display:inline-block;'; var estyle = 'position:absolute;top:0px;left:0px;height:'+eye+'px;' +'width:'+eye+'px;background-color:#ffffff;' +'border-radius: 50%;border: 1px solid #000000;' +'box-shadow: inset -'+eye/3+'px -'+eye/3+'px '+eye/2+ 'px -'+(eye/10|0)+'px rgba(0,0,0,0.16);'; var pstyle = 'position:absolute;top:45%;left:45%;height:'+pup+'px;' +'width:'+pup+'px;background-color:#000000;border-radius: 50%;'; var wstyle = 'position:absolute;top:16%;left:16%;width:20%;height:20%;' +'background:#ffffff;border-radius:50%;' +'transform: skewX(-15deg) skewY(-18deg);'; var c = d.createElement('div'); var e1 = d.createElement('div'); var e2 = d.createElement('div'); var p1 = d.createElement('div'); var p2 = d.createElement('div'); var w1 = d.createElement('div'); var w2 = d.createElement('div'); c.setAttribute('style', cstyle); e1.setAttribute('style', estyle); e2.setAttribute('style', estyle + 'left:'+ros+'px;'); p1.setAttribute('style', pstyle); p2.setAttribute('style', pstyle); w1.setAttribute('style', wstyle); w2.setAttribute('style', wstyle); d.body.appendChild(c); c.appendChild(e1); c.appendChild(e2); e1.appendChild(p1); e2.appendChild(p2); p1.appendChild(w1); p2.appendChild(w2); function ani(y, x) { osy = c.offsetTop; osx = c.offsetLeft; yec = osy + eye5; xec = osx + eye5; d1 = Math.sqrt((y - yec) * (y - yec) + (x - xec) * (x - xec)); d2 = Math.sqrt((y - yec) * (y - yec) + (x - (xec + ros)) * (x - (xec + ros))); a1 = Math.atan2(y - yec, x - xec) * 180 / Math.PI; a2 = Math.atan2(y - yec, x - (xec + ros)) * 180 / Math.PI; le = (d1 < eye5) ? d1 / rng : grng; re = (d2 < eye5) ? d2 / rng : grng; p1.style.top = yec - pup5 + le * Math.sin(a1 * Math.PI / 180) - osy + pix; p1.style.left = xec - pup5 + le * Math.cos(a1 * Math.PI / 180) - osx + pix; p2.style.top = yec - pup5 + re * Math.sin(a2 * Math.PI / 180) - osy + pix; p2.style.left = (xec) - pup5 + re * Math.cos(a2 * Math.PI / 180) - osx + pix; } function mouse(e) { var y, x; if (!e) { e = window.event; } y = e.pageY - 1; x = e.pageX - 1; ani(y, x); } d.addEventListener("mousemove",mouse,false); })();。最简单的事情就是添加无定型的setter。在反序列化时杰克逊需要安装者。对于序列化,所需的只是getter。

修改

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

@JsonCreator

查看更多Jackson Annotations: @JsonCreator demystified

答案 1 :(得分:3)

我不是绝对正面的,但我认为就是这样。

杰克逊想要工作的方式是:它使用默认(无参数)构造函数创建对象。然后它使用setter来设置每个实例变量。这似乎是漫长的过程,但它确实是唯一的方法,因为杰克逊真的不够聪明,无法弄清楚传递构造函数参数的顺序。所以你的代码有两个主要问题(好吧,三个,但是我会假设你的班级被称为股票,然后你大部分时间将其清理干净;-)) 1.你需要一个无参数的构造函数。据我所知,java提供了一个默认的构造函数,如果你不写一个,但只要你创建任何构造函数,默认的无参数构造函数就会消失。
2.您需要为实例变量设置setter(并将它们公开为不够好,它们必须有实际的setter)。哦,看起来你的实例变量是最终的,这是行不通的。我最喜欢管理所有复制/粘贴的setter的方法是使用一个名为lombok的库。无论如何,现在你只需要那些安装者。