Получение требуемых значений от десерализации Json до объекта в Java
Мне нужно сделать объект из Json в PlayFramework.
Example example = Json.fromJson( request().body().asJson() , Example.class);
Но мне нужно всегда иметь все значения в объекте.
class Example{
@Required_from_Json public String name;
@Required_from_Json public boolen dead;
@Required_from_Json public Integer age;
.
.
50 more values
}
Если один из них в Json отсутствует, он все равно создает объект, но с нулевым значением. Мне нужно вызвать некоторое исключение (вероятно, NullPointException), если какое-то значение отсутствует в json или если объект "null" и его глупо проверять каждое свойство отдельно (например, возраст != null)
Ребята, у вас есть какие-нибудь советы на этот счет?
Спасибо!!
2 ответов:
Поскольку ваш объект JSON исходит из запроса, вы можете фактически использовать функцию Play Form для обработки вашей ситуации.
В вашем методе контроллера вы просто вызовете его, как показано ниже:
final Form<Example> form = Form.form(Example.class).bindFromRequest();Для привязки данных из запроса. Затем вы можете проверить, есть ли такие ошибки:
if(from.hasErrors()) { return badRequest(form.errorsAsJson()); }И извлечь объект из формы, если нет ошибок
Example obj = form.get();Ваш пример класса также необходимо изменить, чтобы использовать проверку Play Противопоказания:
import play.data.validation.Constraints; ... class Example{ @Constraints.Required public String name; @Constraints.Required public boolean dead; @Constraints.Required public Integer age; . . 50 more values }EDIT: здесь я должен отметить, что имена свойств объекта JSON и имена переменных свойств класса должны быть одинаковыми, чтобы отображение работало автоматически.
Этот способ довольно хорош, поскольку ошибки, которые он возвращает, являются специфичными для полей, поэтому вы можете отображать их своим пользователям, и он вернет все ошибки для всех полей в одном объекте json (
form.errorsAsJson()). У вас также есть дополнительное преимущество использования других аннотаций проверки, предоставляемых Играть (напр.@Contraints.Email,@Constraints.MinLenthи т.д.)Заметьте , что это сработало для меня в игре
2.3.x. Я не использовать любые последние версии игры, поэтому YMMV.
Этот вопрос очень похож на ваш. Это не о пьесе, но все же о Джексоне:
Настройте Джексона на выдачу исключения, когда поле отсутствует
Редактировать: вы можете создать короткий валидатор самостоятельно:
for (Field f : obj.getClass().getFields()) { f.setAccessible(true); if (f.get(obj) == null) { // Throw error or return "bad request" or whatever } }Этот пример основан на Можно ли в Java проверить, являются ли поля объектов нулевыми, а затем добавить значение по умолчанию ко всем этим атрибутам?
Comments