Дополнительно
Как передать "Null" (настоящую фамилию!) в веб-службу SOAP в ActionScript 3
У нас есть сотрудник, фамилия которого Null. Наше приложение для поиска сотрудников погибает, когда эта фамилия используется в качестве поискового запроса (что происходит довольно часто). Полученная ошибка (спасибо Fiddler!) такова:
<soapenv:Fault>
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>coldfusion.xml.rpc.CFCInvocationException: [coldfusion.runtime.MissingArgumentException : The SEARCHSTRING parameter to the getFacultyNames function is required but was not passed in.]</faultstring>
Мило, да?
Тип параметра - строка
.
Я использую:
Обратите внимание, что ошибка не возникает при вызове веб-сервиса как объекта со страницы ColdFusion.
4596
9
<Н1> следопыт </Н1> Сначала я думал, что это была ошибка принуждения, где "нуль" становится преобразован в
"нуль"
В и тест в"нуль" и == нуль
проходил. Это's не. Я был близок, но так очень, очень неправильно. Сожалею об этом!Я'вэ так много махинаций на wonderfl.net и трассировка через код в mx.rpc.xml.*
. В строке 1795 из XMLEncoder
(в 3.5 источник), вметода setValue
, все XMLEncoding сводится кчто по сути одно и то же, что:
Этот код, по моему оригинал скрипку, возвращает пустой XML-элемента. Но почему?
<Н1> причиной </Н1>
По данным комментатор Джастин Маклин на отчет об ошибке флекс-33664 Следующая виновница (см. Два последних тестов в моем скрипка, что в этом убедиться):
Когда currentChild.метода appendChild
передает строку в
"нуль"В, он сначала преобразует его в корневой элемент XML с текстом
нуль`, а затем проверяет, что элемент с нулевой литерал. Это слабая равенства тест, так что либо XML, содержащий значение null приводится к нулевой тип, или нулевой тип приводится к корневой XML элемент, содержащий строку с "нуль", и тест проходит, где это возможно, должна быть отклонена. Одним из способов исправить можно всегда использовать строгое равенство тесты при проверке XML (или что угодно) и"nullness.&и"<Н1>решение</Н1> Единственный разумный способ решения проблемы я могу думать, хватает ли исправление этой ошибки в каждой версии ActionScript, является проверка поля на "нуль" и убежать от них, значения типа CDATA.
Значения типа CDATA являются наиболее подходящим способом видоизменились все текстовое значение, которое бы в противном случае вызвать кодирование/декодирование проблем. Наговора, кодирования, например, предназначен для отдельных символов. Значения CDATA также являются предпочтительными, когда вы'вновь выбираясь весь текст элемента. Самая главная причина этого в том, что он сохраняет удобочитаемость.
На заметку xkcd, на сайте Bobby Tables есть хороший совет, как избежать неправильной интерпретации пользовательских данных (в данном случае строки "Null") в SQL-запросах на различных языках, включая ColdFusion.
Из вопроса не ясно, что это источник проблемы, а учитывая решение, отмеченное в комментарии к первому ответу (встраивание параметров в структуру), кажется вероятным, что дело в чем-то другом.
Проблема может заключаться в кодере SOAP в Flex. Попробуйте расширить кодировщик SOAP в приложении Flex и отладьте программу, чтобы увидеть, как обрабатывается нулевое значение.
Я предполагаю, что оно передается как NaN (Not a Number). Это может иногда испортить процесс размаршалинга SOAP-сообщений (наиболее заметно в сервере JBoss 5...). Я помню, как расширял кодировщик SOAP и выполнял явную проверку того, как обрабатывается NaN.
@doc_180 имел право понятие, кроме того, что он ориентируется на цифры, в то время как оригинальный плакат имел проблемы со строками.
Решением является изменение МХ.протокол RPC.в формате XML.Файл XMLEncoder`. Это строка 121:
(Я посмотрел в Flex 4.5.1 СДК; номера строк могут отличаться в других версиях.)
В принципе, проверку не удается выполнить, потому что 'контент-нуль' и, следовательно, ваш аргумент не добавляется в исходящий пакет SOAP; таким образом, что отсутствует параметр ошибки.
Вы должны расширить этот класс, чтобы удалить проверки. Тогда есть большой снежный ком, в цепи, изменяя SOAPEncoder использовать свой модифицированный XMLEncoder, а затем изменить операции, чтобы использовать свой модифицированный SOAPEncoder, а затем moidfying веб-сервиса для использования альтернативного класса обслуживания.
Я потратил несколько часов на это, но мне нужно двигаться дальше. Это'Лл возможно, займет день или два.
Вы сможете просто исправить линию XMLEncoder и сделать некоторые ямочный обезьяна, чтобы использовать свой собственный класс.
Я'll тоже добавить, что если вы переключитесь на использование remoteobject, которые инициируют/АМФ с ColdFusion, нулевая передается без проблем.
11/16/2013 обновление:
Еще одно недавнее дополнение к моему последнему комментарию о remoteobject, которые инициируют/АМФ. Если вы с использованием ColdFusion&ампер;усилитель; nbsp;10; затем Свойства со значением null на объект несколько удален от объекта на стороне сервера. Таким образом, вы должны проверить существование свойства перед доступом к нему или вы получите ошибку времени выполнения.
Проверить такой:
Это изменение в поведении с ColdFusion&ампер;усилитель; nbsp;9; где значение null свойства превратятся в пустые строки.
Редактировать 12/6/2013
Поскольку возник вопрос о том, как значения null обрабатываются, вот небольшой пример приложения, чтобы продемонстрировать, как струна, что "нуль", которая будет относиться к зарезервированное слово null.
Выходные данные трассировки:
Перевести все символы в их hex-эквивалентные сущности. В данном случае,
нуль
будет преобразован вЭ;KС;С;
Строкового представления в
нулевое
значение в в ActionScript будет выдавать строку в"нуль"
в. Я подозреваю, что кто-то решил, что это, поэтому хорошая идея, чтобы декодировать строку в"нуль"
в качественуль
, в результате поломки вы видите здесь -- наверное, потому, что они проходили в "нуль" объектов и получение строк в базе данных, когда они не'т хотим, чтобы (так что будьте уверены, чтобы проверить, что за глюк, тоже).В качестве хака можно рассмотреть возможность специальной обработки на стороне клиента, преобразуя 'Null' строку в то, что никогда не произойдет, например, XXNULLXX и преобразуя обратно на сервере.
Это не очень красиво, но может решить проблему для такого граничного случая.
Ну, я полагаю, что Флекс' реализация мыла энкодер кажется неправильно сериализовать значения null. Сериализовать их в виде строки нуль не'т, кажется, чтобы быть хорошим решением. Формально правильный вариант, кажется, чтобы передать значение null в качестве:
Таким образом, значение на "нуль" не будет ничего больше, чем допустимое строковое выражение, которое является точно, что вы ищете.
Я думаю, начало этой фиксированной в Apache шлейф должен'т быть так трудно сделать. Я бы порекомендовал открыть вопрос Jira или связаться с ребятами из Апач-флекс рассылку. Однако это было только исправить на стороне клиента. Я могу'т сказать, если на ColdFusion сможете работать с нулевых значений, закодированных таким образом.
См. также Раду Cotescu's блоге пост как отправить нулевые значения в soapUI запросы.
Это'ы ляп, но если там'с минимальной длиной для
SEARCHSTRING
, например 2 символа,подстрока
вSEARCHSTRING
параметр на второго персонажа и передать его в качестве двух параметров вместо:SEARCHSTRING1 (на"ню", У)
иSEARCHSTRING2 (на"МР", у).
`Объединить их вместе при выполнении запроса к базе данных.