Как получить имя поля в случае неупорядочивающей ошибки в CXF?

Предварительное условие: сервис на основе CXF получает запрос/ответ с данными, что нарушает ограничение XSD.

Фактическое поведение: в этом случае CXF возвращает сообщение об ошибке, например:

cvc-maxLength-valid: значение 'string_length_violated_value' с длиной = '28' не является допустимым аспектом по отношению к maxLength '13' для типа 'XSDStringTypeWithLengthRestriction'

Цель: вернуть ошибку потребителю с именем поля, которое содержит неверные данные. Ф.э. что-то вроде этого:

Ответ от провайдера содержит недопустимые данные. Значение 'string_length_violated_value' поля 'field_name' не является допустимым аспектом по отношению к maxLength '13'.

Мне интересно, возможно ли это, и если да, то как определить (откуда получить) это имя поля?


person Milkywayfarer    schedule 05.05.2011    source источник
comment
Я только что столкнулся с аналогичной проблемой, когда я получаю недопустимое значение Unmarshalling Error, но без каких-либо намеков на рассматриваемый элемент, за исключением оскорбительного значения. Поскольку у меня есть сотни элементов в сообщении XML, это похоже на поиск иголки в стоге сена. Мой обходной путь для этого этапа заключается в предоставлении уникальных (фиктивных) значений для каждого элемента, и, поскольку сообщаются значения (но не элементы), это указывает мне на правильный элемент. Однако это утомительно и не очень умно. Я попробую технику JAXB ValidationEventHandler, как только у меня будет немного больше времени.   -  person Withheld    schedule 02.10.2013
comment
Привет, Даниил, прошло много времени, поэтому я не помню подробностей, извините. Но что я могу сказать -- у меня ValidationEventHandler не сработало, так как версия cxf, которую мы использовали, это игнорировала. Это плохая новость, но есть и хорошая — мне удалось получить данные о координатах (номер строки и столбца) из ошибки cxf, копаясь в инкапсулированных объектах — это было нашим решением.   -  person Milkywayfarer    schedule 03.10.2013


Ответы (1)


Я не уверен, что это полностью сработает, но вы можете попробовать:

Вы можете создать JAXB ValidationEventHandler и зарегистрировать его на своей конечной точке.

Полученное событие ValidationEvent содержит базовую строку (которую вы видите выше) и другую информацию. Я бы поставил там точку останова и покопался в событии, чтобы узнать, доступна ли ЛЮБАЯ дополнительная и полезная информация.

person Daniel Kulp    schedule 05.05.2011
comment
большое спасибо! Попробую и сообщу, будет ли результат! - person Milkywayfarer; 06.05.2011
comment
К сожалению, в этом источнике указано, что ValidationEventHandler не позволит вам изменить поведение ответа, и вы не сможете изменить формат ответа SOAP. Это правда? - person Withheld; 02.10.2013