Cumulocity Java SDK: обновление ManagedObjectRepresentation

Функция обновления InventoryApi возвращает объект ManagedObjectRepresentation результата.

В моем коде я успешно использую update() и позже пытаюсь обновить возвращаемое ManagedObjectRepresentation (например, установить некоторые фрагменты), снова вызывая InventoryApi.update().

При этом я получаю код ошибки 422 с сообщением:

Следующие поля не могут быть обновлены: lastUpdated

Это связано с тем, что ранее возвращенный объект имеет этот набор полей, REST API не ожидает, что это поле будет иметь значение.

Теперь возникает мой вопрос: заглянув внутрь класса com.cumulocity.rest.representation.inventory.ManagedObjectRepresentation, я вижу, что поле lastUpdated (строка 36) содержит аннотацию @Null для определенных "операций".

Java-класс ManagedObjectRepresentation

Я не совсем понимаю, что где-то в 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 см. Здесь

Другие вопросы по тегам