在Play Framework中使用UUID作为操作参数

时间:2011-12-10 12:02:41

标签: serialization playframework uuid

我想将UU​​ID用作操作参数。但是,除非我在生成动作URL时在UUID对象上使用.toString(),否则Play似乎以不同方式序列化对象;像这样:referenceId.sequence = -1& referenceId.hashCode = 1728064460& referenceId.version = -1& referenceId.variant = -1& referenceId.timestamp = -1& referenceId.node = -1

但是,使用toString“工作”,但是当我通过简单地直接调用方法从一个动作重定向到另一个动作时,我无法调用toString,因为该方法需要一个UUID。因此它给了我上面显示的表示。

有什么方法可以与某种类型的序列化相交?

2 个答案:

答案 0 :(得分:1)

你不能在你的动作参数中使用字符串吗?您知道此字符串是UUID,因此您始终可以从中重新创建UUID。也许这不是你的解决方案,但这是我的第一个想法。据我所知,当通过参数传递时,播放序列化类似的对象。 如果这对您不起作用,请尝试在此处查找内容:http://www.playframework.org/documentation/1.2.4/controllers

答案 1 :(得分:0)

我找到了一种方法来实现这一点,但是现在它意味着黑客攻击框架代码本身的一部分。

你基本上需要的是一个TypeBinder,用于将String中的值绑定到UUID 并改变了一个小代码 播放/框架/ SRC /播放/数据/结合/ Unbinder.java

    if (!isAsAnnotation) {
        // We want to use that one so when redirecting it looks ok. We could as well use the DateBinder.ISO8601 but the url looks terrible
        if (Calendar.class.isAssignableFrom(src.getClass())) {
            result.put(name, new SimpleDateFormat(I18N.getDateFormat()).format(((Calendar) src).getTime()));
        } else {
            result.put(name, new SimpleDateFormat(I18N.getDateFormat()).format((Date) src));
        }
    }
}
//here's the changed code
else if (UUID.class.isAssignableFrom(src.getClass()))
{
   result.put(name, src.toString());
}
else {
// this code is responsible for the behavior you're seeing right now
        Field[] fields = src.getClass().getDeclaredFields(); 
        for (Field field : fields) {

            if ((field.getModifiers() & BeanWrapper.notwritableField) != 0) {
                // skip fields that cannot be bound by BeanWrapper
                continue;
            }

我正在与框架作者合作修复此问题。将在稍后回来结果。

如果您迫切需要,请自行将更改应用于代码并通过发布重建框架 蚂蚁 在playframework /框架中 目录。