我的团队正在使用BlazeDS将概念验证的Flex应用程序放在基于Spring的服务器之上。
我们进行了大量的日期计算,因此我们在整个代码中和域模型中广泛使用了Joda Time。
现在,我们试图弄清楚如何继续在通过BlazeDS与Flex前端来回发送的DTO中使用Joda Time。
我们的目标是使用ActionScript
3数据类型Date
在Flex端,并有地图我们使用的乔达时间的DateTime
,LocalDate
和LocalTime
类型在Java端。
我们可以解决在将Date
Java自定义类型编组器插入BlazeDS时调用Java时转换Actionscript
3的类型的问题,但这似乎仅针对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);
}
}
问题内容: 假设我以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”值,