Как передать "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>

Мило, да?

Тип параметра - строка.

Я использую:

  • WSDL (SOAP)
  • Flex 3.5
  • ActionScript 3
  • ColdFusion 8

Обратите внимание, что ошибка не возникает при вызове веб-сервиса как объекта со страницы ColdFusion.

Комментарии к вопросу (6)
Решение

<Н1> следопыт </Н1> Сначала я думал, что это была ошибка принуждения, где "нуль" становится преобразован в "нуль" В и тест в "нуль" и == нуль проходил. Это's не. Я был близок, но так очень, очень неправильно. Сожалею об этом!

Я'вэ так много махинаций на wonderfl.net и трассировка через код в mx.rpc.xml.*. В строке 1795 из XMLEncoder (в 3.5 источник), в метода setValue, все XMLEncoding сводится к

currentChild.appendChild(xmlSpecialCharsFilter(Object(value)));

что по сути одно и то же, что:

currentChild.appendChild("null");

Этот код, по моему оригинал скрипку, возвращает пустой XML-элемента. Но почему?

<Н1> причиной </Н1>

По данным комментатор Джастин Маклин на отчет об ошибке флекс-33664 Следующая виновница (см. Два последних тестов в моем скрипка, что в этом убедиться):

var thisIsNotNull:XML = null;
if(thisIsNotNull == null){
    // always branches here, as (thisIsNotNull == null) strangely returns true
    // despite the fact that thisIsNotNull is a valid instance of type XML
}

Когда currentChild.метода appendChildпередает строку в"нуль"В, он сначала преобразует его в корневой элемент XML с текстомнуль`, а затем проверяет, что элемент с нулевой литерал. Это слабая равенства тест, так что либо XML, содержащий значение null приводится к нулевой тип, или нулевой тип приводится к корневой XML элемент, содержащий строку с "нуль", и тест проходит, где это возможно, должна быть отклонена. Одним из способов исправить можно всегда использовать строгое равенство тесты при проверке XML (или что угодно) и"nullness.&и"

<Н1>решение</Н1> Единственный разумный способ решения проблемы я могу думать, хватает ли исправление этой ошибки в каждой версии ActionScript, является проверка поля на "нуль" и убежать от них, значения типа CDATA.

Значения типа CDATA являются наиболее подходящим способом видоизменились все текстовое значение, которое бы в противном случае вызвать кодирование/декодирование проблем. Наговора, кодирования, например, предназначен для отдельных символов. Значения CDATA также являются предпочтительными, когда вы'вновь выбираясь весь текст элемента. Самая главная причина этого в том, что он сохраняет удобочитаемость.

Комментарии (0)

На заметку xkcd, на сайте Bobby Tables есть хороший совет, как избежать неправильной интерпретации пользовательских данных (в данном случае строки "Null") в SQL-запросах на различных языках, включая ColdFusion.

Из вопроса не ясно, что это источник проблемы, а учитывая решение, отмеченное в комментарии к первому ответу (встраивание параметров в структуру), кажется вероятным, что дело в чем-то другом.

Комментарии (0)

Проблема может заключаться в кодере SOAP в Flex. Попробуйте расширить кодировщик SOAP в приложении Flex и отладьте программу, чтобы увидеть, как обрабатывается нулевое значение.

Я предполагаю, что оно передается как NaN (Not a Number). Это может иногда испортить процесс размаршалинга SOAP-сообщений (наиболее заметно в сервере JBoss 5...). Я помню, как расширял кодировщик SOAP и выполнял явную проверку того, как обрабатывается NaN.

Комментарии (1)

@doc_180 имел право понятие, кроме того, что он ориентируется на цифры, в то время как оригинальный плакат имел проблемы со строками.

Решением является изменение МХ.протокол RPC.в формате XML.Файл XMLEncoder`. Это строка 121:

    if (content != null)
        result += content;

(Я посмотрел в 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.

<?xml version="1.0" encoding="utf-8"?>







Выходные данные трассировки:

пустая строка не равна нулю зарезервированное слово использовать != состояние

пустая строка не равна нулю зарезервированное слово, используя == состояние

пустая строка не равна нулю зарезервированное слово, используя === состояние

Комментарии (6)

Перевести все символы в их hex-эквивалентные сущности. В данном случае, нуль будет преобразован в &#4Э;&#75;&#6С;&#6С;

Комментарии (3)

Строкового представления в нулевое значение в в ActionScript будет выдавать строку в "нуль" в. Я подозреваю, что кто-то решил, что это, поэтому хорошая идея, чтобы декодировать строку в "нуль" в качестве нуль, в результате поломки вы видите здесь -- наверное, потому, что они проходили в "нуль" объектов и получение строк в базе данных, когда они не'т хотим, чтобы (так что будьте уверены, чтобы проверить, что за глюк, тоже).

Комментарии (1)

В качестве хака можно рассмотреть возможность специальной обработки на стороне клиента, преобразуя 'Null' строку в то, что никогда не произойдет, например, XXNULLXX и преобразуя обратно на сервере.

Это не очень красиво, но может решить проблему для такого граничного случая.

Комментарии (5)

Ну, я полагаю, что Флекс' реализация мыла энкодер кажется неправильно сериализовать значения null. Сериализовать их в виде строки нуль не'т, кажется, чтобы быть хорошим решением. Формально правильный вариант, кажется, чтобы передать значение null в качестве:

Таким образом, значение на "нуль" не будет ничего больше, чем допустимое строковое выражение, которое является точно, что вы ищете.

Я думаю, начало этой фиксированной в Apache шлейф должен'т быть так трудно сделать. Я бы порекомендовал открыть вопрос Jira или связаться с ребятами из Апач-флекс рассылку. Однако это было только исправить на стороне клиента. Я могу'т сказать, если на ColdFusion сможете работать с нулевых значений, закодированных таким образом.

См. также Раду Cotescu's блоге пост как отправить нулевые значения в soapUI запросы.

Комментарии (1)

Это'ы ляп, но если там'с минимальной длиной для SEARCHSTRING, например 2 символа, подстрока в SEARCHSTRING параметр на второго персонажа и передать его в качестве двух параметров вместо: SEARCHSTRING1 (на"ню", У) и SEARCHSTRING2 (на"МР", у). `Объединить их вместе при выполнении запроса к базе данных.

Комментарии (4)