Несоответствие типа идентификатора при попытке получить

Я просто тестировал свой код сегодня утром и обнаружил то, что, похоже, не могу решить.

В моем классе SKU есть настраиваемый генератор идентификаторов (заданный) для получения строки:

static mapping = {
    id generator: 'assigned', name: 'sku'
}

Я создал объект SKU с идентификатором: 1234445 (обычно мой идентификатор SKU представляет собой смесь тире букв и цифр, но только для целей тестирования я использовал число как строку)

Теперь всякий раз, когда я пытаюсь выполнить SKU.get (1234445), я получаю следующую ошибку:

Указан идентификатор неправильного типа

Ожидается: класс java.lang.String, получил класс java.lang.Long

Очевидно, я предоставил String, почему-то он обрабатывает ее как Long при выполнении .get, следовательно, вызывает ошибку.

Любые идеи о том, как решить эту проблему, кроме использования строки, которая выглядит как номер для SKU.id (Sku.sku в моем случае)?


person 16dots    schedule 28.09.2013    source источник


Ответы (3)


Используйте String id вместо String sku, если хотите использовать SKU.get("123445")

class SKU {
    String id
    static mapping = {
        id generator: 'assigned'
    }
}

def newSku = new SKU()
newSku.id = '123445'
newSku.save(flush: true)

println SKU.get("123445")

Если вам нужно использовать sku в качестве идентификатора, используйте

SKU.findBySku("123445")

с отображением, которое у вас есть прямо сейчас (как указано в вопросе).

person dmahapatro    schedule 28.09.2013
comment
Спасибо, у меня сейчас дежавю, когда я читаю ваш ответ, кажется, что я где-то читал это раньше, но почему-то мне не пришло в голову, что я столкнулся с ошибкой. - person 16dots; 28.09.2013
comment
@ 16dots Когда вы сталкиваетесь с подобными блокираторами, просто используйте grails console и попробуйте все проверить ..... :) - person dmahapatro; 29.09.2013

SKU.get("1234445" as String)

должно сработать

person GreyBeardedGeek    schedule 28.09.2013
comment
Это не работает, все та же ошибка, я как-то думаю, когда он переходит в .get, он конвертируется обратно в Long до достижения базы данных. - person 16dots; 28.09.2013
comment
У вас может возникнуть та же проблема, но убедитесь, что вы используете строго типизированную переменную. Попробуйте, например, String key = '1234445'; SKU.get(key); Также помните, что '1234445' - это строка, а 1234445 - это GString ... - person GreyBeardedGeek; 28.09.2013
comment
Так было изначально в моем коде (он был передан в контроллер с моей точки зрения, то есть: String key = String.valueOf (1234445)), и да, когда я был сбит с толку ошибкой, я попробовал несколько разных способов создать новую строку для моего использования, ни одна из них не прошла, это одна и та же ошибка каждый раз. - person 16dots; 28.09.2013
comment
Что значит "1234445" as String? Сделать String String? - person dmahapatro; 29.09.2013
comment
@dmahapatro - 1234445 - это не строка в Groovy - это GString. '1234445' является строкой (обратите внимание на одинарные кавычки и двойные кавычки) - person GreyBeardedGeek; 29.09.2013
comment
@dmahapatro - Я поправляюсь. Это очень интересно и нелогично. - person GreyBeardedGeek; 30.09.2013
comment
Мне кажется разумным, а не противоречащим интуиции. GStrings появляются, когда мы ожидаем, что значение будет вычислено во время выполнения. Рад, что смог убедить. ;) - person dmahapatro; 30.09.2013

Извините за некромантию потока, но я столкнулся с та же проблема недавно. Как оказалось (благодаря @Peter за решение) проблему можно обойти, дополнительно указав String id в String sku. Следующее немного некрасиво, но работает:

class Sku {
    String id
    String sku
    static mapping = {
        id name: 'sku', generator: 'assigned'
    }
}

Затем в тесте Спока:

when:
(new Sku(sku: sku)).save()

then:
Sku.get(sku)

where:
sku << ['12345', 'f00-b4r']
person David Leaman    schedule 07.12.2017