Ошибка в необязательном поле при использовании Core Service SynchronizeWithSchemaAndUpdate


3

Я пытаюсь синхронизировать компоненты на схеме, которые имеют многозначное необязательное поле «AAA» типа Embedded Schema «Aaa», которое имеет обязательное встроенное текстовое поле «BBB», и другое необязательное встроенное поле «CCC».

AAA - optional multi-value field on Embedded Schema 'Aaa' 
+-> BBB - mandatory single-value text field 
+-> CCC - optional single-value text field 

Когда я создаю элементы на моей схеме, я не должен вводить любое значение поля AAA, и ничего не отображается в компоненте XML. Когда я сохраняю тот же компонент в CME, он успешно сохраняется.

У меня есть клиент основной службы, который выполняет Client.SynchronizeWithSchemaAndUpdate(tcmUri, SynchronizeOptions), где клиент является ICoreService объектом, использующий basicHttp связывания, tcmUri является TCMURI Компоненты и SynchronizeOptions является new SynchronizeOptions { SynchronizeFlags = SynchronizeFlags.All };

Код выше дает FaultException<CoreServiceFault> сообщение которого гласит:

{"XML validation error. Reason: The element 'AAA' in namespace 'Aaa' has incomplete 
content. List of possible elements expected: 'BBB' in namespace 'Aaa'."} 

Это не имеет смысла, почему я получаю эту ошибку. Поле AAA является необязательным для нескольких значений. Только встроенное поле BBB является обязательным, и эта ошибка должна быть выбрана только в том случае, если дополнительное встроенное поле CCC имеет значение, а обязательное поле BBB опущено.

Итак, мои вопросы: что происходит? это ошибка? Кто-нибудь видел эту ошибку раньше?

2

К сожалению, некоторые из флагов являются «разрушительными», что означает, что они могут превратить совершенно правильный XML в недопустимый XML. Следующие флаги должны быть безопасными:

SynchronizeFlags.ApplyDefaultValuesForMissingMandatoryFields | 
SynchronizeFlags.Basic | 
SynchronizeFlags.ConvertFieldType | 
SynchronizeFlags.FixNamespace | 
SynchronizeFlags.RemoveAdditionalValues | 
SynchronizeFlags.RemoveUnknownFields; 

Следующие флаги могут преобразовать действительный XML в Invalid XML:

SynchronizeFlags.ApplyDefaultValuesForMissingNonMandatoryFields 
SynchronizeFlags.ApplyFilterXsltToXhtmlFields 

Надеюсь, мы получим меньше суицидальных альтернативу использованию «Все» в будущих версиях, но, к сожалению, он не попал в версию SDL Web 8.

  0

Действительно, он работает. Не возникает никакого исключения, если отсутствует 'SynchronizeFlags.ApplyDefaultValuesForMissingNonMandatoryFields'. Спасибо за объяснение! 05 янв. 162016-01-05 18:31:19


2

Я уже пробовал и тестировал приведенный выше сценарий, и я вижу, что синхронизация компонентов происходит успешно. Я также попробовал несколько сценариев во встроенных схемах и схемах, и все, кажется, работают нормально. Поэтому, чтобы ответить на ваш вопрос - это не ошибка в API.

Для получения более подробной информации, вы можете проверить или проверить тройную проверку, вы передаете флаг SynchronizeFlags.All во время синхронизации. Кроме того, есть ли что-нибудь еще в журнале, кроме вышеуказанной ошибки?

  0

Я пробовал свой код в трех разных системах, и у меня есть ошибка во всех них. Кажется, это обходное решение - не использование 'SynchronizeFlags.All', а вместо этого использование всех других флагов с побитовым ИЛИ между ними, кроме' SynchronizeFlags.ApplyDefaultValuesForMissingNonMandatoryFields'. Это единственное решение для меня на данный момент. В тот момент, когда я добавляю SynchronizeFlags.ApplyDefaultValuesForMissingNonMandatoryFields, исключение вызывается. 05 янв. 162016-01-05 06:24:42

  0

Это довольно странно 05 янв. 162016-01-05 06:47:41

  0

Я не проверял его сам, но 'SF.All^SF.ApplyDefaultValuesForMissingNonMandatoryFields' должен давать тот же результат, что и побитовое ИЛИ-все остальные флаги. 05 янв. 162016-01-05 19:14:18