Cumulocity Java SDK: обновление ManagedObjectRepresentation
Функция обновления InventoryApi возвращает объект ManagedObjectRepresentation результата.
В моем коде я успешно использую update() и позже пытаюсь обновить возвращаемое ManagedObjectRepresentation (например, установить некоторые фрагменты), снова вызывая InventoryApi.update().
При этом я получаю код ошибки 422 с сообщением:
Следующие поля не могут быть обновлены: lastUpdated
Это связано с тем, что ранее возвращенный объект имеет этот набор полей, REST API не ожидает, что это поле будет иметь значение.
Теперь возникает мой вопрос: заглянув внутрь класса com.cumulocity.rest.representation.inventory.ManagedObjectRepresentation, я вижу, что поле lastUpdated (строка 36) содержит аннотацию @Null для определенных "операций".
Я не совсем понимаю, что где-то в SDK, если этот объект используется как часть операции CREATE или UPDATE, это поле должно быть пустым. Если бы это было так, мой вышеупомянутый вызов update() с ManagedObjectRepresentation, для которого установлено это поле, не должен вызывать проблем. Это не вариант.
Каково реальное использование этой аннотации @Null? Я использую SDK неправильно? Я знаю, что один из способов заставить запрос работать - просто установить для поля lastUpdated значение null, но я подумал, что это было целью аннотации@Null..
Использование клиентской библиотеки Java версии 8.13.
2 ответа
Эти аннотации @Null оцениваются для проверки входящих объектов на стороне сервера. Как вы написали параметры должны быть нулевыми для перечисленных операций. Существует также аналогичная аннотация @NotNull, используемая в других API.
InventoryApi или другие классы Java API не оценивают эти аннотации. Параметры не устанавливаются в ноль автоматически.
В общем, я бы рекомендовал обновлять объекты только теми свойствами, которые вы хотите обновить, и исключать неизмененные свойства. Это позволяет избежать конфликтов с другими параллельными обновлениями того же объекта.
НЕТ, вы используете SDK правильно. Как вы упомянули set the lastUpdated field to null
это единственный способ обновить managedObjectRepresentation. Это связано с тем, что время lastUpdated устанавливается только кучностью, а не пользователем (разработчиком) (я думаю, что пользователь может слишком долго указывать дату, поэтому не позволяет устанавливать время обновления).
Подходя к Вашему вопросу:
Способ обновления представления управляемого объекта: рассмотреть mo
ваше представление управляемого объекта
mo.setName("String Name");//you can set whatever you want
mo.setLastUpdated(null);// without lastupdated you cannot update mo
platform.getInventoryApi().update(mo);
И использование аннотации @NULL:
В этом рабочем случае Вы устанавливаете LastUpdated в null, это будет генерировать исключение нулевого указателя, чтобы перехватить исключение (преодоленное из исключения) @null аннотация.
Для получения дополнительной информации о @null см. Здесь