【问题标题】:JSON Post request for boolean field sends false by default布尔字段的 JSON Post 请求默认发送 false
【发布时间】:2014-03-21 18:12:58
【问题描述】:

您好,我正在使用 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 的值时,无论我发送什么都是 false。 我在我的 JSON 请求中尝试了以下值

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

以上所有都在我的控制器中发送 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;
}   
}

【问题讨论】:

  • 我们可以看看你的全班,getter/setter 吗?
  • 需要更多关于模型和 DAO 的信息
  • 您的名字和姓氏变量设置是否正确?
  • 隐约可能被名称混淆了。也许它会喜欢 setIsActive,例如。 (似乎这些 API 中的每一个都有稍微不同的命名约定。)
  • @NewQueries 我知道这是一个老问题,您已经有了解决方案。这适用于面临类似问题的其他读者。您可以在 json 中将 isActive 字段设置为必填字段,因为这将始终直接要求调用者提供真/假值,因此如果请求中缺少该字段,您将不会得到假。

标签: java json spring-mvc jackson pojo


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      请记住,默认情况下,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)和修改器(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;
      

      【讨论】:

      • 两种解决方案都有效。 (@JsonProperty 并更改 get 和 set 方法名称)。它现在正在正确识别真假。但是对于 null 和 ""(空白),它发送默认值 false。这个可以改吗?
      • @NewQueries 您希望它默认为true?只需在声明 private boolean isActive = true; 中初始化类中的字段
      • 我在构造函数中这样做。公共 POJOUserDetails(){ this.isActive = true;我不希望它一定是真的。只是想知道我是否可以读取传递的确切值,无论是空白、null还是布尔值。
      • 看起来只有当该字段根本没有传递时,它才会从构造函数/初始化中获取默认值。它将空/空白更改为假。没关系。非常感谢大家的帮助!!
      • 如果你添加一个@JsonProperty,它可以工作,但是响应json会有两个属性。一个是“isActive”,另一个是“Active”。此行为具有带有 lombok.@Getter 和 lombok.@Setter 的布尔属性。最好的解决方案是将 postman/RESTClient 中的属性设置为“活动”。不要更改代码中的任何内容。
      猜你喜欢
      • 1970-01-01
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 2016-03-28
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      相关资源
      最近更新 更多