【问题标题】:Use UUID as action parameters in Play Framework在 Play Framework 中使用 UUID 作为动作参数
【发布时间】:2011-12-10 12:02:41
【问题描述】:

我想使用 UUID 作为操作参数。但是,除非我在生成动作 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。因此,它给了我上面显示的表示。

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

【问题讨论】:

    标签: serialization playframework uuid


    【解决方案1】:

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

    【讨论】:

    • 使用 String 是可能的,但话说回来,为什么首先要有 UUID 类?它有一定的格式,我不想做额外的测试等,以确保它是一个实际的 UUID。
    【解决方案2】:

    我找到了一种方法来做到这一点,但现在这意味着破解框架代码本身的一部分。

    您基本上需要的是一个 TypeBinder,用于将值从 String 绑定到 UUID 和一个小的代码更改 play/framework/src/play/data/binding/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/框架中 目录。

    【讨论】:

    • 谢谢。看起来这可能是目前最好的答案。我通过不直接调用 action 方法解决了这个问题,而是在我传递的所有 UUID 上使用 redirect() 和 toString() 。因此,假设稍后将在框架中处理这一点,我可以忍受这个(无需更改框架代码)。谢谢你的回答:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 2018-07-12
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多