Используйте UUID в качестве параметров действия в Play Framework - PullRequest
1 голос
/ 10 декабря 2011

Я хотел бы использовать UUID в качестве параметров действия. Однако, если я не использую .toString () для объектов UUID при генерации URL-адресов действий, Play, похоже, сериализует объект по-другому; Примерно так: referenceId.sequence = -1 & referenceId.hashCode = 1728064460 & referenceId.version = -1 & referenceId.variant = -1 & referenceId.timestamp = -1 & referenceId.node = -1

Однако использование toString «работает», но когда я перенаправляю из одного действия в другое, просто вызывая метод напрямую, я не могу вызвать toString, так как метод ожидает UUID. Поэтому это дает мне представление, показанное выше.

Можно ли как-нибудь пересечь сериализацию определенного типа?

Ответы [ 2 ]

1 голос
/ 10 декабря 2011

разве вы не можете просто использовать строку в параметре действия? Вы знаете, что эта строка является UUID, поэтому вы всегда можете воссоздать UUID из нее. Может быть, это не решение для вас, но это моя первая мысль. Насколько я знаю, play сериализует подобные объекты при прохождении их через параметры. Если это не работает, попробуйте найти что-то здесь: http://www.playframework.org/documentation/1.2.4/controllers

0 голосов
/ 12 декабря 2011

Я нашел способ сделать это, но сейчас это означает взлом части самого кода фреймворка.

Что вам в основном нужно, так это 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;
            }

Я работаю с авторами фреймворка над решением этой проблемы. вернусь позже с результатами.

если вам это нужно срочно, примените изменения к коду самостоятельно и перестройте фреймворк, выполнив муравей в игровой рамке / каркасе каталог.

...