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

Java 默认情况下,布尔字段的JSON Post请求发送false,java,json,spring-mvc,jackson,pojo,Java,Json,Spring Mvc,Jackson,Pojo,您好,我正在使用FireFox RestClient发送JSON Post请求 我的JSON请求如下: { "firstName": "Test", "lastName": "1", "isActive": 1 } 我的POJO具有如下所示的活动字段 private boolean isActive; @RequestMapping(method = {RequestMethod.POST, RequestMethod

您好,我正在使用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){
我的控制器定义如下

  private boolean isActive;
@RequestMapping(method = {RequestMethod.POST, 
                                 RequestMethod.PUT}, value = "/save")
public ResponseEntity<RestResponse> save(
      @RequestBody POJOUserDetails userDetails, WebRequest request){
所有这些在我的控制器中都发送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;
}   
}

请记住,默认情况下,Jackson根据第一个匹配的getter或setter来确定属性名

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

public void setFirstName(String firstName) {

public void setLastName(String lastName) {

public void setActive(boolean isActive) {
在JSON中。这些基本上是firstName,lastName,active

您将获得以下JSON

{ "firstName": "Test", "lastName": "1", "isActive": 1 }
所以firstName和lastName是映射的,但是您没有名为isActive的属性

Jackson依赖于javabean命名约定及其访问器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;

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

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

我们可以看到您的完整类吗,还有getter/setter?需要更多关于模型和dao的信息您的firstName和lastName变量设置是否正确?很可能是名称混淆了它。可能它需要setIsActive,例如。似乎这些API中的每一个都有一个稍微不同的命名约定。@newquerys我知道这是一个老问题,您已经有了解决方案。这是给其他面临类似问题的读者的。您可以将isActive字段设置为json中的必填字段,因为这将始终要求调用者直接输入true/false值,这样,如果请求中缺少该字段,您就不会像您的情况那样得到false。这两种解决方案都有效@JsonProperty并更改get和set方法名称。它现在正在正确地识别真假。但对于null和blank,它发送默认值false。这可以更改吗?@newquerys您希望它默认为true吗?只需在声明private boolean isActive=true中初始化类中的字段;我是在承包商那里做的。公共POJOUserDetails{this.isActive=true;}我不希望它一定是真的。我只是想知道我是否可以读取传递的确切值,无论是空白值、null值还是布尔值。看起来只有在该字段根本没有传递的情况下,才会从构造函数/初始化中获取默认值。它将null/blank更改为false。那很好。非常感谢大家的帮助!!如果添加@JsonProperty,它可以工作,但是响应json将有两个属性。一个是活动的,另一个是活动的。此行为具有lombok@Getter和lombok@Setter的布尔属性。最好的解决方案是让postman/RESTClient中的属性处于活动状态。不要更改代码中的任何内容。