Запрос JSON Post для логического поля отправляет false по умолчанию

Привет, я отправляю запрос JSON Post с помощью FireFox RestClient.

Мой запрос 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

Все вышеперечисленное отправляет 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

Помните, что Джексон по умолчанию определяет имя свойства либо из получателя, либо из сеттера (первое, что соответствует).

Чтобы десериализовать объект типа POJOUserDetails, Джексон будет искать три свойства

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.

Джексон зависит от соглашений об именах Java Bean с их аксессуарами (getters) и мутаторами (сеттерами). Для поля типа

private boolean isActive;

соответствующие имена сеттера/получателя

public boolean getIsActive() {
    return isActive;
}

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

Итак, у вас есть два возможных решения. Измените свой геттер/сеттер, как показано выше, или аннотируйте свое поле с помощью @JsonProperty, чтобы Джексон использовал имя поля для определения имени свойства

@JsonProperty
private boolean isActive;

Ответ 2

Когда вы используете библиотеки, такие как lombok, для генерации методов получения и установки, не добавляйте "is" с именем поля, если тип поля имеет логическое значение. Потому что Джексон использует стандартное соглашение по именованию bean-компонентов java и добавляет "is" при настройке полей. поэтому добавление 'is' делает неправильное отображение поля