【问题标题】:ID type mismatch when trying to get尝试获取时 ID 类型不匹配
【发布时间】:2013-09-28 16:54:49
【问题描述】:

今天早上早些时候刚刚测试了我的代码,发现了一些我似乎无法解决的问题。

我的 SKU 类有一个自定义 ID 生成器(已分配)来获取字符串:

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

我创建了一个 ID 为“1234445”的 SKU 对象(通常我的 SKU id 是短划线字母和数字的混合体,但出于测试目的,我使用数字作为字符串)

现在每当我尝试执行 SKU.get("1234445") 时,都会收到以下错误:

提供了错误类型的 id

预期:类 java.lang.String,得到类 java.lang.Long

显然我提供了一个字符串,不知何故它在执行 .get 时将其视为 Long,从而导致错误。

除了不使用看起来像 SKU.id(在我的情况下为 Sku.sku)的数字的字符串之外,关于如何解决此问题的任何想法?

【问题讨论】:

    标签: grails groovy grails-orm


    【解决方案1】:

    如果要使用SKU.get("123445"),请使用String id 而不是String sku

    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")
    

    使用您现在拥有的映射(如问题中所述)。

    【讨论】:

    • 谢谢,当我正在阅读您的答案时,现在有点似曾相识,感觉就像我以前在某个地方读过这个但不知何故它并没有因为遇到错误而出现在我身上。跨度>
    • @16dots 当你遇到这类拦截器时,只需使用grails console 并尝试测试一下...... :)
    【解决方案2】:
    SKU.get("1234445" as String)
    

    应该有效

    【讨论】:

    • 它不起作用,仍然是同样的错误,我想当它进入.get时,它在到达数据库之前被转换回Long。
    • 您可能会遇到同样的问题,但请确保您使用的是强类型变量。例如,尝试String key = '1234445'; SKU.get(key); 另外,请记住 '1234445' 是一个字符串,而 "1234445" 是一个 GString...
    • 就像我的代码中最初的那样(从我的角度来看,它被传递到控制器中,即: String key = String.valueOf(1234445) ),是的,那是我对错误感到困惑的时候,我尝试了几种不同的方法来构造一个新的字符串供我使用,它们都没有通过,每次都是同样的错误。
    • "1234445" as String 是什么意思?将String 投射到String?
    • @dmahapatro - "1234445" 不是 groovy 中的字符串 - 它是 GString。 '1234445' is 字符串(注意单引号与双引号)
    【解决方案3】:

    对不起线程死灵,但我最近遇到了the same problem。事实证明(感谢@Peter 的解决方案)您可以通过定义String id 来解决此问题除了 String sku。以下内容有点难看但有效:

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

    然后在 Spock 测试中:

    when:
    (new Sku(sku: sku)).save()
    
    then:
    Sku.get(sku)
    
    where:
    sku << ['12345', 'f00-b4r']
    

    【讨论】:

      猜你喜欢
      • 2015-02-03
      • 2015-01-17
      • 2018-03-29
      • 1970-01-01
      • 2011-03-31
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多