java JSON Post请求布尔字段默认发送false

yacmzcpb  于 2023-01-29  发布在  Java
关注(0)|答案(4)|浏览(290)

您好,我正在使用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。

"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;
}   
}
hgc7kmma

hgc7kmma1#

记住,默认情况下,Jackson从getter或setter(第一个匹配的)确定属性名。
要反序列化POJOUserDetails类型的对象,Jackson将查找三个属性

public void setFirstName(String firstName) {

public void setLastName(String lastName) {

public void setActive(boolean isActive) {

基本上就是firstNamelastNameactive
您将获得以下JSON

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

所以firstNamelastName是Map的,但是没有名为isActive的属性。
Jackson依赖于JavaBean的访问器(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;
zengzsys

zengzsys2#

当你使用像lombok这样的库来生成getter和setter的时候,如果字段类型是boolean的话,不要在字段名后面加上'is',因为Jackson使用java默认的命名bean约定,在设置字段的时候会加上'is',所以加上'is'会导致字段Map错误

wi3ka0sx

wi3ka0sx3#

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

qyswt5oh

qyswt5oh4#

应该使用布尔值而不是布尔值。

相关问题