2014-02-20 57 views
15

您好我正在使用FireFox RestClient发送JSON Post请求。JSON布尔字段的发布请求默认发送false

我的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; 
} 
} 
+0

我们能看到你满级,getter/setter方法以及注释你的领域? –

+0

需要有关模型和DAO的更多信息 – Filipe

+0

您的firstName和lastName变量设置是否正确? – gravityplanx

回答

37

记得杰克逊,在默认情况下,无论从getter或setter(第一匹配)决定了属性名称。

反序列化POJOUserDetails类型的对象,杰克逊将查找三个属性

public void setFirstName(String firstName) { 

public void setLastName(String lastName) { 

public void setActive(boolean isActive) { 
在JSON

。这些基本上是firstNamelastName,active

会得到以下JSON

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

所以firstNamelastName映射,但你没有属性命名isActive

杰克逊依赖于Java Bean的命名约定及其访问器(getter)和增变器(setters)。对于像

private boolean isActive; 

场相应的setter /吸气名

public boolean getIsActive() { 
    return isActive; 
} 

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

所以,你有两种可能的解决方案。更改您的getter/setter如上图所示,或@JsonProperty让杰克逊使用的字段名确定属性名

@JsonProperty 
private boolean isActive; 
+0

这两个解决方案都有效。 (@JsonProperty和更改get和set方法名称)。它现在正确地认识到真假。但是对于null和“”(空白),它会发送默认值false。这可以改变吗? – NewQueries

+0

@NewQueries您希望默认情况下它是“真”吗?只需在声明中初始化你的类中的字段'private boolean isActive = true;' –

+1

我在构造器中这样做。 public POJOUserDetails(){this.isActive = true; }我不希望它是必然的。只是想知道是否可以读取传递的确切值,无论是空白还是空值或布尔值。 – NewQueries