通过BlazeDS从Java到Flex的自定义编组

发布于 2021-01-29 19:43:36

我的团队正在使用BlazeDS将概念验证的Flex应用程序放在基于Spring的服务器之上。

我们进行了大量的日期计算,因此我们在整个代码中和域模型中广泛使用了Joda Time。

现在,我们试图弄清楚如何继续在通过BlazeDS与Flex前端来回发送的DTO中使用Joda Time。

我们的目标是使用ActionScript
3数据类型Date在Flex端,并有地图我们使用的乔达时间的DateTimeLocalDateLocalTime类型在Java端。

我们可以解决在将DateJava自定义类型编组器插入BlazeDS时调用Java时转换Actionscript
3的类型的问题,但这似乎仅针对Flex-> Java / BlazeDS方向而不是Java / BlazeDS-> Flex方向被调用。

我现在正在寻找PropertyProxyBlazeDS的自定义实现,但这也不是正确的选择。

另一个想法是Externalizable在我们的Java DTO
上实现,但这似乎工作太多,尤其是当我查看BlazeDS竞争对手GraniteDS时,这表明使用简单的类型转换器在其文档中插入了Joda Time支持!

任何想法表示赞赏。

关注者
0
被浏览
89
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    好的-
    我自己找到了答案。这涉及编写我自己的AMF端点类和相关的序列化类。我要说的是,http://flexblog.faratasystems.com上的家伙一直是黑客BlazeDS灵感的重要来源。

    该代码实际上应该合并到BlazeDS本身或某个开放源代码扩展项目中-它是如此基础。

    频道定义

        <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
            <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="ch.hedgesphere.core.blazeds.endpoint.AMFEndpoint"/>
    
             <properties>
                <serialization>
                    <type-marshaller>ch.hedgesphere.core.blazeds.translator.HedgesphereASTranslator</type-marshaller>
                </serialization>
            </properties>
    
        </channel-definition>
    

    自定义AMF端点

    package ch.hedgesphere.core.blazeds.endpoint;
    
    import ch.hedgesphere.core.blazeds.serialization.Serializer;
    
        public class AMFEndpoint extends flex.messaging.endpoints.AMFEndpoint {
    
        @Override
        protected String getSerializerClassName() {
            return Serializer.class.getName();
            }
    
        }
    

    自定义序列化器

    package ch.hedgesphere.core.blazeds.serialization;
    
    import java.io.OutputStream;
    
    import flex.messaging.io.MessageIOConstants;
    import flex.messaging.io.SerializationContext;
    import flex.messaging.io.amf.AmfMessageSerializer;
    import flex.messaging.io.amf.AmfTrace;
    
    public class Serializer extends AmfMessageSerializer {
    
        @Override
        public void initialize(SerializationContext context, OutputStream out, AmfTrace trace)
        {
            amfOut = new AMF0Output(context);
            amfOut.setOutputStream(out);
            amfOut.setAvmPlus(version >= MessageIOConstants.AMF3);
    
            debugTrace = trace;
            isDebug = trace != null;
            amfOut.setDebugTrace(debugTrace);
        }
    }
    

    自定义AMF 0处理

    package ch.hedgesphere.core.blazeds.serialization;
    
    import flex.messaging.io.SerializationContext;
    
    public class AMF0Output extends flex.messaging.io.amf.Amf0Output {
    
    public AMF0Output(SerializationContext context) {
        super(context);
    }
    
    @Override
        protected void createAMF3Output()
        {
            avmPlusOutput = new AMF3Output(context);
            avmPlusOutput.setOutputStream(out);
            avmPlusOutput.setDebugTrace(trace);
        }
    }
    

    自定义AMF 3处理

    package ch.hedgesphere.core.blazeds.serialization;
    
    import java.io.IOException;
    
    import org.joda.time.DateTime;
    import org.joda.time.LocalDate;
    import org.joda.time.LocalTime;
    
    import flex.messaging.io.SerializationContext;
    
    public class AMF3Output extends flex.messaging.io.amf.Amf3Output {
    
    public AMF3Output(SerializationContext context) {
        super(context);
    }
    
    @Override
    public void writeObject(Object value) throws IOException {
        if(value instanceof DateTime) {
            value = convertToDate((DateTime)value);
        }
        if(value instanceof LocalDate) {
            value = convertToDate((LocalDate)value);
        }
        if(value instanceof LocalTime) {
        value = convertToDate((LocalTime)value);
        }
        super.writeObject(value);
    }
    
    private Object convertToDate(LocalTime time) {
        return time.toDateTimeToday().toDate();
    }
    
    private Object convertToDate(LocalDate date) {
        return date.toDateMidnight().toDate();
    }
    
    private Object convertToDate(DateTime dateTime) {
        return dateTime.toDate();
    }   
    }
    

    用于Flex-> Java调用的自定义Marshaller

    package ch.hedgesphere.core.blazeds.translator;
    
    import org.joda.time.DateTime;
    import org.joda.time.LocalDate;
    import org.joda.time.LocalTime;
    
    import flex.messaging.io.amf.translator.ASTranslator;
    
    
    public class HedgesphereASTranslator extends ASTranslator {
    
    @SuppressWarnings({"rawtypes"})
    @Override
    public Object convert(Object originalValue, Class type) {
        if( type.equals(DateTime.class)) {
            return convertToDateTime(originalValue);
        }
        if( type.equals(LocalDate.class)) {
        return convertToLocalDate(originalValue); 
        }
        if( type.equals(LocalTime.class)) {
            return convertToLocalTime(originalValue);
        }
    
        return super.convert(originalValue, type);
    }
    
    private Object convertToLocalTime(Object originalValue) {
        return originalValue == null ? null : new LocalTime(originalValue);
    }
    
    private Object convertToLocalDate(Object originalValue) {
        return originalValue == null ? null : new LocalDate(originalValue); 
    }
    
    private Object convertToDateTime(Object originalValue) {
        return originalValue == null ? null : new DateTime(originalValue);
    }
    
    @SuppressWarnings({"rawtypes"})
    @Override
    public Object createInstance(Object source, Class type) {
        return super.createInstance(source, type);
    }
    }
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看