У нас есть сотрудник, фамилия которого 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.
<Н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 = <root>null</root>;
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 также являются предпочтительными, когда вы'вновь выбираясь весь текст элемента. Самая главная причина этого в том, что он сохраняет удобочитаемость.
На заметку 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:
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 на объект несколько удален от объекта на стороне сервера. Таким образом, вы должны проверить существование свойства перед доступом к нему или вы получите ошибку времени выполнения.
Проверить такой:
<cfif (structKeyExists(arguments.myObject,'propertyName')>
<!--- no property code --->
<cfelse>
<!--- handle property normally --->
</cfif>
Это изменение в поведении с ColdFusion&ампер;усилитель; nbsp;9; где значение null свойства превратятся в пустые строки.
Редактировать 12/6/2013
Поскольку возник вопрос о том, как значения null обрабатываются, вот небольшой пример приложения, чтобы продемонстрировать, как струна, что "нуль", которая будет относиться к зарезервированное слово null.
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" initialize="application1_initializeHandler(event)">
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
protected function application1_initializeHandler(event:FlexEvent):void
{
var s :String = "null";
if(s != null){
trace('null string is not equal to null reserved word using the != condition');
} else {
trace('null string is equal to null reserved word using the != condition');
}
if(s == null){
trace('null string is equal to null reserved word using the == condition');
} else {
trace('null string is not equal to null reserved word using the == condition');
}
if(s === null){
trace('null string is equal to null reserved word using the === condition');
} else {
trace('null string is not equal to null reserved word using the === condition');
}
}
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
</s:Application>
Выходные данные трассировки:
пустая строка не равна нулю зарезервированное слово использовать != состояние
пустая строка не равна нулю зарезервированное слово, используя == состояние
пустая строка не равна нулю зарезервированное слово, используя === состояние
Строкового представления в нулевое
значение в в ActionScript будет выдавать строку в "нуль"
в. Я подозреваю, что кто-то решил, что это, поэтому хорошая идея, чтобы декодировать строку в "нуль"
в качестве нуль
, в результате поломки вы видите здесь -- наверное, потому, что они проходили в "нуль" объектов и получение строк в базе данных, когда они не'т хотим, чтобы (так что будьте уверены, чтобы проверить, что за глюк, тоже).
В качестве хака можно рассмотреть возможность специальной обработки на стороне клиента, преобразуя 'Null' строку в то, что никогда не произойдет, например, XXNULLXX и преобразуя обратно на сервере.
Это не очень красиво, но может решить проблему для такого граничного случая.
Ну, я полагаю, что Флекс' реализация мыла энкодер кажется неправильно сериализовать значения null. Сериализовать их в виде строки нуль не'т, кажется, чтобы быть хорошим решением. Формально правильный вариант, кажется, чтобы передать значение null в качестве:
<childtag2 xsi:nil="true" />
Таким образом, значение на "нуль" не будет ничего больше, чем допустимое строковое выражение, которое является точно, что вы ищете.
Я думаю, начало этой фиксированной в Apache шлейф должен'т быть так трудно сделать. Я бы порекомендовал открыть вопрос Jira или связаться с ребятами из Апач-флекс рассылку. Однако это было только исправить на стороне клиента. Я могу'т сказать, если на ColdFusion сможете работать с нулевых значений, закодированных таким образом.
См. также Раду Cotescu's блоге пост как отправить нулевые значения в soapUI запросы.
Это'ы ляп, но если там'с минимальной длиной для SEARCHSTRING
, например 2 символа, подстрока
в SEARCHSTRING
параметр на второго персонажа и передать его в качестве двух параметров вместо: SEARCHSTRING1 (на"ню", У)
и SEARCHSTRING2 (на"МР", у).
`Объединить их вместе при выполнении запроса к базе данных.