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

2022-08-31 20:45:09

嗨,我正在使用FireFox RestClient发送JSON Post请求。

我的 JSON 请求如下所示:

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

我的POJO有以下活动字段

  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

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

答案 1

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

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

public void setFirstName(String firstName) {

public void setLastName(String lastName) {

public void setActive(boolean isActive) {

在 JSON 中。这些基本上是、 、 。firstNamelastNameactive

您将获得以下 JSON

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

因此,并进行了映射,但您没有名为 .firstNamelastNameisActive

Jackson 依赖于 Java Bean 命名约定及其访问器(getters)和 mutators(setters)。对于像这样的字段

private boolean isActive;

适当的设置者/获取者名称是

public boolean getIsActive() {
    return isActive;
}

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

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

@JsonProperty
private boolean isActive;

答案 2

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