Ошибка при реализации Enums с использованием Actionscript 3 - PullRequest
0 голосов
/ 22 сентября 2010

Это наш проект Flex / Parsley / Blazeds / Spring, и я пытаюсь реализовать java-перечисления в Actionscript3, и все, что мне нужно сделать, это отправить значение Enum методу службы Spring.

Код Java Enum (генерируется из XSD)

public enum ReferenceLookupType {
    PATIENT_VISIT_TYPE("PATIENT_VISIT_TYPE"), PATIENT_STATUS(
            "PATIENT_STATUS"), PATIENT_VISIT_INVALID_REASON(
            "PATIENT_VISIT_INVALID_REASON"), LIPID_PREFILLED_CODE(
            "LIPID_PREFILLED_CODE");

 private final String value;

    private ReferenceLookupType(String value) {
        this.value = value;
    }

    public String toString() {
        return value;
    }

    public static ReferenceLookupType convert(String value) {
        for (ReferenceLookupType inst : values()) {
            if (inst.toString().equals(value)) {
                return inst;
            }
        }
        return null;
    }
}

Список действий ActionScript:

package {

[Bindable]
    [RemoteClass(alias="gov.hhs.cms.ehrds.datacollection.model.ReferenceLookupType")]
    public final class ReferenceLookupType {

        public static const PATIENT_VISIT_TYPE:ReferenceLookupType = new ReferenceLookupType("PATIENT_VISIT_TYPE");
        public static const PATIENT_STATUS:ReferenceLookupType = new ReferenceLookupType("PATIENT_STATUS");
        public static const PATIENT_VISIT_INVALID_REASON:ReferenceLookupType = new ReferenceLookupType("PATIENT_VISIT_INVALID_REASON");
        public static const LIPID_PREFILLED_CODE:ReferenceLookupType = new ReferenceLookupType("LIPID_PREFILLED_CODE");

private var _value:String;

        public function ReferenceLookupType(value:String) : void
        {
            _value = value;
        }

        public function toString():String
        {
            return _value;
        }
    }
}

В коде mxml:

[Bindable]
            private var refLookupType:ReferenceLookupType = ReferenceLookupType.LIPID_PREFILLED_CODE;


dispatcher(new ReferenceDataMessage(refLookupType, "RefData"));

Ошибка, которую я получаю:

"Unable to create a new instance of type 'gov.hhs.cms.ehrds.datacollection.model.ReferenceLookupType'." faultCode="Client.Message.Encoding" faultDetail="Types cannot be instantiated without a public, no arguments constructor."


[RPC Fault faultString="Unable to create a new instance of type 'gov.hhs.cms.ehrds.datacollection.model.ReferenceLookupType'." faultCode="Client.Message.Encoding" faultDetail="Types cannot be instantiated without a public, no arguments constructor."]
    at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::faultHandler()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\rpc\AbstractInvoker.as:345]
    at mx.rpc::Responder/fault()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\rpc\Responder.as:68]
    at mx.rpc::AsyncRequest/fault()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\rpc\AsyncRequest.as:113]
    at NetConnectionMessageResponder/statusHandler()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\messaging\channels\NetConnectionChannel.as:609]
    at mx.messaging::MessageResponder/status()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\messaging\MessageResponder.as:264]

Не могли бы вы помочь мне в том, что мне здесь не хватает, и о том, как правильно реализовать Enums в Actionscript.

Спасибо

Хариш

1 Ответ

4 голосов
/ 23 сентября 2010

Перечисления не работают "из коробки" во Flex / BlazeDS. Вы должны сделать немного пользовательской магии.

Авторитетный источник по теме - безусловно эта запись в блоге от Farrata Systems.

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

Итак, вам нужно использовать собственный сериализатор / десериализатор для Enums.

FWIW, я бы также посоветовал взглянуть на DTO2FX от той же команды. Они будут генерировать версии ActionScript ваших перечислений Java правильно и автоматически, чтобы их можно было отправлять по проводам без сбоев.

...