Нулевые значения при чтении удаленного объекта из Java POJO с использованием BlazeDS и Flash Builder
Я не получаю никаких ошибок при запуске следующих файлов, но данные, возвращаемые из объекта Java POJO, поступающего из приведенных ниже операторов trace():
[object ComputerInfo]
null
[object ComputerInfo]
null
и у меня нет идей, как это отладить. Я пытался адаптировать код, взятый отсюда.
Мои клиентские файлы выглядят следующим образом. Мой MXML-файл:
<?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">
<fx:Script><![CDATA[
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
private var reqId1:int = 0;
public var dataReadFromDB:ComputerInfo = new ComputerInfo;
private function readFaultHandler( event:FaultEvent ):void
{
Alert.show( event.fault.faultString, "Error reading data" );
}
private function readResultHandler( event:ResultEvent ):void
{
dataReadFromDB.javaVersion = event.result.javaVersion;
dataReadFromDB.javaVendor = event.result.javaVendor;
dataReadFromDB.os = event.result.os;
dataReadFromDB.osVersion = event.result.osVersion;
dataReadFromDB.requestId = event.result.requestId;
trace(dataReadFromDB);
trace(dataReadFromDB.javaVersion);
trace(event.result);
trace(event.result.javaVersion);
}
]]></fx:Script>
<fx:Declarations>
<mx:RemoteObject
id="ro"
destination="myDestination"
showBusyCursor="true">
<mx:method name="readData"
result="readResultHandler(event);"
fault="readFaultHandler(event);"/>
</mx:RemoteObject>
</fx:Declarations>
<mx:Panel width="476" height="281"
layout="absolute" title="BlazeDS Example"
cornerRadius="0" backgroundColor="#ffffff">
<s:Label x="46" y="59" text="Click to Read Data" />
<s:Button x="200" y="59" label="Read Now" click="ro.readData( reqId1++ )"/>
</mx:Panel>
</s:Application>
Файл ComputerInfo.as:
package {
[RemoteClass(alias="ComputerInfo")]
public class ComputerInfo {
public var javaVersion:String;
public var javaVendor:String;
public var os:String;
public var osVersion:String;
public var requestId:String;
}
}
Мои файлы Java:
public class MyClass {
public ComputerInfo readData( String requestId ) {
ComputerInfo computerInfo = new ComputerInfo();
computerInfo.javaVersion = "java.vm.version";
computerInfo.javaVendor = "java.vm.vendor";
computerInfo.os = "osname";
computerInfo.osVersion = "os.version";
computerInfo.requestId = "requestId";
return computerInfo;
}
}
и отдельный файл с именем ComputerInfo.java:
public class ComputerInfo {
String javaVersion;
String javaVendor;
String os;
String osVersion;
String requestId;
}
Внутри remoting-config.xml:
<destination id="myDestination">
<properties>
<source>myClass</source>
</properties>
</destination>
2 ответа
Кажется, вам не хватает мета-тегов [RemoteClass] в вашем объекте передачи данных (ComputerInfo.as):
package {
[RemoteClass(alias="com.myjavapackage.ComputerInfo")]
public class ComputerInfo { ... }
}
(где вам нужно заменить "com.myjavapackage" на соответствующие значения; пакет не упоминался в ваших примерах кода)
Если теги отсутствуют, Flex не сможет десериализовать данные в соответствующий тип, и вместо этого вы получите объект типа "ObjectProxy".
Вы также можете удалить собственное копирование значений результата - event.result
уже будет типа ComputerInfo
, если все прописано правильно.
РЕДАКТИРОВАТЬ
Кроме того, ваши переменные поля в вашем классе Java должны быть public
или должно быть public
методы получения и установки.
Для получения дополнительной информации см. Adobe Doc. Соответствующим разделом является "Явное сопоставление объектов ActionScript и Java".
Хотя это не прямой ответ на ваш вопрос BlazeDS (weltraumpirat уже достаточно хорошо на него ответил), вы также можете рассмотреть возможность использования GraniteDS и его инструментов генерации кода (см. Документацию здесь): вам больше не придется писать руками свой AS3 классы и все ваши поля Java, включая приватные / защищенные, будут сериализованы (хотя непрозрачное поле Java, т. е. объявленное приватным без getter/setter, останется непрозрачным в сгенерированном классе AS3).