Нулевые значения при чтении удаленного объекта из Java POJO с использованием BlazeDS и Flash Builder - PullRequest
1 голос
/ 24 февраля 2012

Я не получаю никаких ошибок при запуске следующих файлов, но данные, возвращаемые из объекта 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 ]

1 голос
/ 24 февраля 2012

Хотя это не прямой ответ на ваш вопрос BlazeDS (weltraumpirat уже достаточно хорошо на него ответил), вы также можете рассмотреть возможность использования GraniteDS и его инструментов генерации кода (см. Документацию здесь ): вам больше не нужно будет писать руками ваши классы AS3, и все ваши поля Java, включая частные / защищенные, будут сериализованы (хотя непрозрачное поле Java, т.е. объявлено как частное безgetter / setter, останется непрозрачным в сгенерированном классе AS3).

1 голос
/ 24 февраля 2012

В вашем объекте передачи данных (ComputerInfo.as) отсутствуют метатеги [RemoteClass]:

package {
    [RemoteClass(alias="com.myjavapackage.ComputerInfo")]
    public class ComputerInfo { ... }
}

(где вам нужно заменить «com.myjavapackage» на соответствующие значения; пакет не был упомянут в ваших примерах кода)

Если теги отсутствуют, Flex не сможет десериализовать данные в соответствующий тип, и вместо этого вы получите объект типа «ObjectProxy».

Вы также можете удалить собственное копирование значений результата - event.result уже будет иметь тип ComputerInfo, если все будет зарегистрировано правильно.

EDIT

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

Для получения дополнительной информации см. Adobe Doc . Соответствующий раздел «Явное сопоставление объектов ActionScript и Java».

...