У меня есть компонент, который не является unmarshalling, но нет сообщения об ошибке - конечная точка вместо этого вызывается с нулевым экземпляром компонента.MOXy unmarshalled bean from @PUT имеет значение null, в зависимости от заказа свойства JSON
Это Джерси 2.22.1, с его поставщиком JAXB по умолчанию (MOXy).
Я воспроизвел проблему с очень простым бобом:
@XmlRootElement
public class Expense {
private BigDecimal units;
private BigDecimal unitRate;
public BigDecimal getUnits() {
return units;
}
public void setUnits(BigDecimal units) {
this.units = units;
}
public BigDecimal getUnitRate() {
return unitRate;
}
public void setUnitsRate(BigDecimal unitRate) {
this.unitRate = unitRate;
}
}
PUT
метод ресурс:
public class ExpenseResource {
@PUT
@Consumes(MediaType.APPLICATION_JSON)
public Response putExpense(Expense e) {
if (e == null) {
throw new BadRequestException("Failed to marshall expense object");
}
return TAEUtil.buildPutResponse(uriInfo, "/expenses/%d", this.expenseID);
}
//....
}
Когда HTTP PUT
отправляется ExpenseResource.putExpense называется, но вся фасоль аргумент часто устанавливается равным null. Я не получаю никаких исключений или зарегистрированных ошибок.
Возможно, это зависит от свойств JSON и их порядка. В частности, в следующем формате JSON делает не маршализацию:
{ "units": null, "unitRate": null }
Но если поменять местами два свойства, демаршаллизации работы!
{ "unitRate": null, "units": null }
Тестирование показывает следующее:
- Пока unitRate не последнее свойство JSON, Expense unmarshalls правильно.
Если unitRate является конечным свойством, но не имеет значение null, Expense unmarshalls BUT unitRate сам по себе (его значение null). Пример: {"units": 5, "unitRate": 5}
Обратите внимание, что «единицы» также являются BigDecimal, но при последнем, а не в нулевом значении - неправильно. Но я не вижу разницы между этими двумя свойствами.
Добавление фиктивного окончательного имущества не имеет значения.
{ "единицы": 8, "unitRate": нулевой, "ZZZ": ""} // не удается
Несмотря на изоляцию поведение этой одной области у меня нет каких-либо объяснений или обходной путь. Предложения приветствуются!
Обновлено с новой информацией. Проблема JSON, похоже, вызывает проблему. Скорее .. – Bampfer
Мне удалось воспроизвести проблему с гораздо более простым примером, поэтому я переписал вопрос. – Bampfer