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