当前位置: 首页 > 面试题库 >

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

澹台蕴藉
2023-03-14
问题内容

我的团队正在使用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支持!

任何想法表示赞赏。


问题答案:

好的-
我自己找到了答案。这涉及编写我自己的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);
}
}


 类似资料:
  • 问题内容: 假设我以ng-repeat以表格格式显示以下数据。 以上代码取自http://code.ciphertrick.com/2015/06/01/search-sort-and-pagination- ngrepeat-angularjs/ 这样我们就可以搜索。无论用户在搜索文本框中输入哪种内容,都将基于该过滤器生成数据,但是我的要求有些不同。 我将有一个下拉列表,其中将填充所有字段名称,

  • 问题内容: 我有一个简单的场景:向每个HTTP响应自动添加响应标头;我想用Java做到这一点。 看一下,有一些动作示例可以用作注释。我想避免添加到每个处理程序。 综观斯卡拉过滤器中,并具体地讲,我看到一个明确的机制,但我不熟悉不够使用Scala推断为Java。 所以:我从这里去哪里? 问题答案: 不幸的是,目前还没有一种从Java创建和使用过滤器的好方法。但是,您可以使用Scala轻松完成所需的工

  • 我正在尝试通过@Autowoe注释将过滤器JWTLoginFilter传递给WebSecurityConfig WebSecurityConfirerAdapter。当JWTLoginFilter尝试从WebSecurityConfig获取Auth验证管理器时,问题就出现了。 当我启动服务器时,我得到这个错误: 描述: 应用程序上下文中某些bean的依赖关系形成一个循环: JWTLoginFilt

  • 我有一个罐子,里面有一个蚂蚁任务。我的com/mebigfatguy/stringliterals/antlib.xml是 运行jar tf StringLiterals.jar 我将jar放入~/.ant/lib中,当我尝试运行引用它的任务时,如下所示: 我得到了 文字: 这里的GitHub项目https://GitHub.com/mebigfatguy/stringliterals

  • BlazeDS是一个基于服务器的Java 远程控制(remoting)和Web消息传递(messaging)技术, 它能够使得后端的Java应用程序和运行在浏览器上的Adobe Flex应用程序相互通信。

  • 我想从我的脚本中实现一个自定义的nginx缓存控制方法,通过使用自定义标头:"Do-Cache"。我用在nginx的超文本传输协议块: 在nginx的服务器块中: 因此,对于Do-Cache: Public,nginx应该缓存响应。否则不会。 但这种配置不起作用。通过在日志中调试,和的值是正确的,直到它们在nginx的服务器块中使用为止。如果在服务器块中使用它们(,或简单的),则变量获得“1”值,