Запрос 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' делает неправильное отображение поля