- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的团队正在使用 BlazeDS 在基于 Spring 的服务器之上构建一个概念验证 Flex 应用程序。
我们进行了大量的日期计算,因此我们在整个代码和领域模型中广泛使用 Joda Time。
我们现在正试图找出如何在我们的 DTO 中继续使用 Joda Time,这些 DTO 通过 BlazeDS 与 Flex 前端来回发送。
我们的目标是使用 Actionscript 3 数据类型 Date
在 Flex 方面,并将该映射映射到我们对 Joda 时间的 DateTime
的使用, LocalDate
和 LocalTime
Java 端的类型。
我们可以解决Actionscript 3的转换问题Date
使用插入 BlazeDS 的自定义类型编码器调用 Java 时的类型,但这似乎仅针对 Flex->Java/BlazeDS 方向调用,而不针对 Java/BlazeDS->Flex 方向调用。
我现在正在查看自定义 PropertyProxy
BlazeDS 的实现,但这看起来也不是正确的事情。
另一个想法是实现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>
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);
}
}
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);
}
}
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();
}
}
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);
}
}
关于java - 通过 BlazeDS 从 Java 到 Flex 的自定义编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4053003/
我正在尝试弄清楚如何使用 Blaze API 以编程方式将变量助手插入到模板中。我相信这需要使用某种形式来完成: Blaze.render(Blaze.with('variable', content
BlazeDS 是作为 servlet 实现的,因此仅限于大约数百个同时用户。 我想知道支持 Servlet 3 的最新 Web 容器(Tomcat 7、GlassFish/Grizzly、Jetty
这个问题在这里已经有了答案: How can I get the index of an array in a Meteor template each loop? (6 个回答) 6年前关闭。 有没
我知道如何通过更扩展的、可能是“正确的”方法来做到这一点,但我想知道是否有任何更简单的方法来做到这一点。 {{> alert message="My message"}} 基本上,我有一个采用值 me
我正在尝试下载 blazeDS 以将我 future 的 Adobe Flex 应用程序与 Java Web 应用程序集成,我发现的所有链接都来自 this site并指向 Adobe 的网站
如果我的 services-config.xml 文件中有以下内容用于在 Linux 服务器上设置 BlazeDS 日志文件,它会将日志文件保存在哪里?或者,输出是否默认显示在 Flash Build
我有一个更改 DOM 的模板,我想在保存到数据库时重新呈现模板。在 Blaze 之前,如果模板中某处有反应变量,Meteor 会重新渲染整个模板,但现在我该怎么做呢? 我在 Iron 路由器路由中设置
我们正在移除我们的 XSL-> HTML 解决方案,并为我们的用户群用 Flex UI 替换它。关注点之一是 BlazeDS(amf 端点,因此流或轮询)将无法像 EJB -> XML -> XSLT
仅使用远程服务的 BlazeDS 中可能的最大并发连接数是多少 最佳答案 远程调用是简单的 HTTP POST 调用……每个远程调用都将在应用服务器线程之一上执行。所以最大并发连接数将取决于您的服务器
我有一个 flex 客户端,可以对运行 BlazeDS 的 tomcat 服务器进行服务调用。我想在这种环境中优雅地处理服务器 session 超时。 我确实对服务有安全限制,因此客户端通过基于目标初
您好,我正在使用 Meteor & Blaze。 我的路线如下所示: FlowRouter.route('/software', { name: 'software', action(
我在 js 文件中有这个: isAdmin: function() { if (Meteor.user().roles[0] == "admin") { return tr
在我的 meteor 应用程序中,我想预加载一个选择选项列表,其中包含我收集的值。 在我的模板中我尝试了这个,它有效: {{#each items}} {{value}}
在处理 meteor 时我突然发现这个错误 quackadmin@quack:~/quack$ sudo meteor [[[[[ ~/quack ]]
是否有一种方法可以自动捕获 BlazeDS 远程处理方法引发的所有(未经检查的)异常,而无需将每个异常包装在最后的 try/catch block 中?我的代码根据需要捕获任何已检查的异常,但我希望杂
我在 js 文件中有这个: isAdmin: function() { if (Meteor.user().roles[0] == "admin") { return tr
寻求有关如何构建 blazeds/flex 游戏通信的建议。我想要实现的是拥有 x 不。服务器上发生的游戏,每个游戏将包含 2 到 6 名玩家。我认为这将涉及通过创建子主题来分割提要。例如,游戏 A
我有 2 个相同的 java 类(想象一下 getter 和 setter): class ScheduledEvent { private String eventName; priva
我有一些实现序列化的 Java 类,以及实现 IExternalizable 的相应 AS 对象(由 GAS 自生成)。 从服务器接收对象没有问题,但是当我尝试将对象发送到服务器时 - 它抛出异常:
我发现 blaze 生态系统* 令人惊叹,因为它涵盖了大多数数据工程用例。在 2015-2016 年期间,这些项目肯定有很多兴趣,但最近被忽略了。我这样说是看 github repos 上的提交。 所
我是一名优秀的程序员,十分优秀!