Flex Java BlazeDS日期差异

uinbv5nw  于 2022-09-21  发布在  Java
关注(0)|答案(2)|浏览(144)

我正在尝试使用BlazeDS将数据从flex Side发送到Java

FLEX中的字段类型

private var _scheduleDate:Date;

我已经用new Date()对其进行了初始化,如果发出警报,系统上会显示正确的日期和时间。现在,当对象被发送到Java时。日期变了。

请注意,我的flex应用程序和Java(JBoss服务器在同一台机器上运行)。如果我独立地在Java端打印用new Date()初始化的日期,它也会显示系统的正确日期。

现在转换部分:在FLEX上

2013年4月25日12:30 PM(显示警报)

当我打印这个经过的日期(在Java端)时,它的

2013年4月25日下午02:30(时差2小时)

我读了很多关于解决方案的博客等,他们提到这是一个时区问题,但我不明白,如果客户端和服务器都在一个系统上,时区问题怎么会导致这个问题。

具有新的Date()Alert(flex)println(java)会显示截至系统的正确日期,因此时区问题是如何产生的。我唯一能想到的是,BlazeDS导致了这个问题。

在此链接中,他们引用了blazeDS的一些定制编组,但它超出了我的理解Custom Marshalling from Java to Flex via BlazeDS

现在我对这个问题只有一个解决方案,那就是将String中的日期作为纯文本而不是Date对象发送,并在Java端将String转换回Date对象。

有没有更好的解决办法,或者如果我的理解有任何问题,请谁指出这一点。

谢谢,

c90pui9n

c90pui9n1#

我建议采取以下解决方案。

首先,发送客户端时区偏移量并将其存储为会话属性。

弹性

ro.setClientTimezoneOffset(-new Date().getTimezoneOffset() * 60 * 1000);

Java

public void setClientTimezoneOffset(Long t) {
    FlexContext.getFlexSession().setAttribute("clientTimezoneOffset", t);
}

创建我们自己的端点类,扩展flex.messaging.endpoints.AMFEndpoint并将其指向通道定义:

服务-config.xml

<channel-definition id="my-amf"
            class="mx.messaging.channels.AMFChannel">
    <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" 
                class="com.package.AMFEndpoint"/>
</channel-definition>

AMFEndpoint t.Java

package com.package;

public class AMFEndpoint extends flex.messaging.endpoints.AMFEndpoint {

    @Override
    protected String getSerializerClassName() {
        return Serializer.class.getName();
    }

    @Override
    protected String getDeserializerClassName() {
        return Deserializer.class.getName();
    }
}

扩展AMF串行器、反串行器、AMF输入/输出:

Serializer.Java

package com.package;

import flex.messaging.io.MessageIOConstants;
import flex.messaging.io.SerializationContext;
import flex.messaging.io.amf.AmfMessageSerializer;
import flex.messaging.io.amf.AmfTrace;

import java.io.OutputStream;

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);
    }
}

desializer.java

package com.package;

import flex.messaging.io.SerializationContext;
import flex.messaging.io.amf.AmfMessageDeserializer;
import flex.messaging.io.amf.AmfTrace;

import java.io.InputStream;

public class Deserializer extends AmfMessageDeserializer {
    @Override
    public void initialize(SerializationContext context, InputStream in, AmfTrace trace) {
        amfIn = new AMF0Input(context);
        amfIn.setInputStream(in);

        debugTrace = trace;
        isDebug = debugTrace != null;
        amfIn.setDebugTrace(debugTrace);
    }
}

AMF0Input.Java

package com.package;

import flex.messaging.io.SerializationContext;
import flex.messaging.io.amf.Amf0Input;

import java.io.IOException;

public class AMF0Input extends Amf0Input {
    public AMF0Input(SerializationContext context) {
        super(context);
    }

    @Override
    public Object readObject() throws ClassNotFoundException, IOException {
        if (avmPlusInput == null) {
            avmPlusInput = new AMF3Input(context);
            avmPlusInput.setDebugTrace(trace);
            avmPlusInput.setInputStream(in);
        }
        return super.readObject();
    }
}

AMF0Output.Java

package com.package;    

import flex.messaging.io.SerializationContext;
import flex.messaging.io.amf.Amf0Output;

public class AMF0Output extends Amf0Output {
    public AMF0Output(SerializationContext context) {
        super(context);
    }

    @Override
    protected void createAMF3Output()
    {
        avmPlusOutput = new AMF3Output(context);
        avmPlusOutput.setOutputStream(out);
        avmPlusOutput.setDebugTrace(trace);
    }
}

最后,扩展AMF3输入/输出类,其中Date被序列化和反序列化。您可以应用偏移差额。

AMF3Input.Java

package com.package;

import flex.messaging.FlexContext;
import flex.messaging.io.SerializationContext;
import flex.messaging.io.amf.Amf3Input;

import java.io.IOException;
import java.util.Date;

public class AMF3Input extends Amf3Input {
    @Override
    protected Date readDate() throws IOException {
        Date d = super.readDate();
        if (d != null) {
            Long clientOffset = (Long) FlexContext.getFlexSession().getAttribute("clientTimezoneOffset");
            Long serverOffset = (Long) (-d.getTimezoneOffset() * 60L * 1000);
            d.setTime(d.getTime() - (serverOffset - clientOffset));
        }
        return d;
    }

    public AMF3Input(SerializationContext context) {
        super(context);
    }
}

AMF3Output.Java

package com.package;

import flex.messaging.FlexContext;
import flex.messaging.io.SerializationContext;
import flex.messaging.io.amf.Amf3Output;

import java.io.IOException;
import java.util.Date;

public class AMF3Output extends Amf3Output {
    public AMF3Output(SerializationContext context) {
        super(context);
    }

    @Override
    protected void writeAMFDate(Date d) throws IOException {
        if (d != null) {
            Long clientOffset = (Long) FlexContext.getFlexSession().getAttribute("clientTimezoneOffset");
            Long serverOffset = (Long) (-d.getTimezoneOffset() * 60L * 1000);
            d.setTime(d.getTime() + (serverOffset - clientOffset));
        }
        super.writeAMFDate(d);
    }
}

现在,在Flex前端和BlazeDS后端之间传递的所有日期都将自动转换。请注意,您实际上更改了日期

假设服务器时区为GMT+6,客户端为GMT+2时区。您正在从数据库中检索日期。Java上的日期是01.01.2013 10.00.00 GMT+6,通常flex会得到01.01.2013 06.00.00 GMT+2。日期相同,但字符串的等效值不同。在我们的例子中,flex将得到01.01.2013 10.00.00 GMT+2。我们改了日期。但字符串等效项是相同的。

bxfogqkk

bxfogqkk2#

此外,为了与以前版本的Java兼容,创建另一个类:

package br.com.ultreia.flex;

import java.io.OutputStream;

import flex.messaging.io.MessageIOConstants;
import flex.messaging.io.SerializationContext;
import flex.messaging.io.amf.AmfTrace;

public class Java15AmfMessageSerializer extends flex.messaging.io.amf.Java15AmfMessageSerializer{
    @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);
    }
}

并且我更改了类AMFEndpoint.Java

public class AMFEndpoint extends flex.messaging.endpoints.AMFEndpoint {

    public AMFEndpoint(){
        super();
    }

    @Override
    protected String getSerializerClassName() {
        return Serializer.class.getName();
    }

    @Override
    protected String getSerializerJava15ClassName() {
        return Java15AmfMessageSerializer.class.getName();
    }

    @Override
    protected String getDeserializerClassName() {
        return Deserializer.class.getName();
    }
}

相关问题