默认情况下,对布尔字段的JSON Post请求发送为false

时间:2014-02-20 16:34:45

标签: java json spring-mvc jackson pojo

您好我正在使用FireFox RestClient发送JSON Post请求。

我的JSON请求如下:

 { "firstName": "Test", "lastName": "1", "isActive": 1 }

我的POJO有isActive字段,如下所示

  private boolean isActive;

我的控制器定义如下

@RequestMapping(method = {RequestMethod.POST, 
                                 RequestMethod.PUT}, value = "/save")
public ResponseEntity<RestResponse> save(
      @RequestBody POJOUserDetails userDetails, WebRequest request){

在我的POJO中,当我检查isActive的值时,无论发送什么,它都是假的。 我在我的JSON请求中尝试了以下值

"isActive": 1
"isActive": true 
"isActive": "true"
"isActive": ""
"isActive": null
"isActive": false

以上所有内容都在我的控制器中发送错误。请帮忙。感谢

添加POJO详细信息

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonSerialize(include=Inclusion.NON_EMPTY)
public class POJOUserDetails {
private String firstName;
private String lastName;
private boolean isActive;

public boolean isActive() {
    return isActive;
}
public void setActive(boolean isActive) {
    this.isActive = isActive;       
}

    public String getFirstName() {
    return firstName;
}
public void setFirstName(String firstName) {
    this.firstName = firstName;
}
public String getLastName() {
    return lastName;
}
public void setLastName(String lastName) {
    this.lastName = lastName;
}   
}

3 个答案:

答案 0 :(得分:69)

请记住,默认情况下,Jackson会从getter或setter(匹配的第一个)中确定属性名称。

要反序列化POJOUserDetails类型的对象,Jackson会查找三个属性

public void setFirstName(String firstName) {

public void setLastName(String lastName) {

public void setActive(boolean isActive) {
在JSON中

。这些基本上是firstNamelastNameactive

您将获得以下JSON

{ "firstName": "Test", "lastName": "1", "isActive": 1 }

因此映射firstNamelastName,但您没有名为isActive的属性。

Jackson依赖于Java Bean命名约定及其访问者(getter)和mutators(setter)。对于像

这样的字段
private boolean isActive;

适当的setter / getter名称是

public boolean getIsActive() {
    return isActive;
}

public void setIsActive(boolean isActive) {
    this.isActive = isActive;
}

所以你有两个可能的解决方案。如上所示更改您的getter / setter或使用@JsonProperty注释您的字段,以便Jackson使用字段名称来确定属性名称

@JsonProperty
private boolean isActive;

答案 1 :(得分:0)

另一方面,我们可以使用Boolean包装器来处理它,这样IDE可以通过在整个布尔字段的名称中添加前缀get/set来生成getter / setter。

答案 2 :(得分:-1)

当您使用lombok之类的库来生成getter和setter时, 如果字段类型为布尔值,则不要在字段名称中添加“ is”。因为Jackson使用Java的默认命名bean约定并在设置字段时添加了“ is”。因此添加“ is”会使字段映射错误