新手第一次接触 通过Jersey搭建RESTFul服务, 在前端传过来的Json转化为POJO的时候遇到了 一些问题, 主要是 Boolean, Enum 的转化。
public class TestDO {
private boolean isStore;
private ExecMode mode;
}
enum Execmode {
HIVE , SHARK
}
出错的POJO定义如上,传过来的Json为
{
"isStore":true,
"mode":"HIVE"
}
这样总是报错,isStore not marked as ignorable</span>
去掉 isStore, mode 会报错 value not one of declared Enum instance names 等等;
由于第一次接触,不是很熟悉,所以通过各种 stackoverflow 找到了一些原因:
1. boolean类型 deserialize 的时候需要指定它的类型,即加上注释:@JsonDeserialize( as = Boolean.class ), 那声明的时候也只能用 Boolean.
2. enum犯错更低级了,因为HIVE,SHARK的值是 0,1 ,所以Json里对应字段的值应该是 0,1, 而不是HIVE,SHARK字符串, 如果要传字符串的形式(能够很好理解含义,一般这种方式吧),需要对enum定义做出修改如下:
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">enum ExecMode {</span>
HIVE("HIVE"),
SHARK("SHARK");
private final String value;
@JsonCreator
private ExecMode(final String description) {
this.value = description;
}
@JsonValue
final String value() {
return this.value;
}
}
将HIVE,SHARK的值指定为字符串,然后在构造函数,value函数分别加上 @JsonCreator, @JsonValue的注释
通过上述的修改, 前段传输 :
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">{</span>
"isStore":true,
"mode":"HIVE"
}
</pre><pre name="code" class="html">
</pre><pre name="code" class="html"><span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">就不会有问题了。</span>