【问题标题】:GroovyRowResult coerce into domain objectGroovyRowResult 强制转换为域对象
【发布时间】:2013-10-19 14:03:51
【问题描述】:

鉴于此表:

CREATE TABLE todouser
(
  id SERIAL,
  email varchar(80) UNIQUE NOT NULL,
  password varchar(80),
  registered boolean DEFAULT FALSE,
  confirmationUri varchar(280),
  CONSTRAINT todouser_pkey PRIMARY KEY (id)
);

和类:

class TodoUser {
    Long id;
    String email;
    String password;
    String confirmationUri;
    boolean registered;
}

我正在尝试执行以下操作:

TodoUser user = sql.firstRow("""SELECT * FROM todouser WHERE email = $email""")

即我希望 Groovy 将 GroovyRowResult 强制转换为我的基本 POGO,而不是像 this answer 那样自己构建它。

我认为这是合理的,因为 GroovyRowResult 实现了 Map 并且它只是 POGO 实例变量名称映射的 Map 键...... Groovy 有某种支持。

问题在于,在 PostgreSQL 表中,“confirmationUri”实际上显示为“confirmationuri”......因此映射失败,因为在我的 POGO 中“U”为大写。

我已经尝试在表和 POGO 中将“confirmationUri”更改为“confirmation”,并且它可以工作...但为了记录,您将如何在 Groovy 中解决这个问题?

我似乎记得有一些方法可以在 Groovy 类中重写,这有助于解决“set/get”调用。但这是正确的方法吗?当调用“get/set”方法时,是否有一些注释可以用来将“confirmationUri”标记为“confirmationuri”?或者也许在 Groovy 中有其他方法可以做到这一点?

【问题讨论】:

  • 我认为您的编辑应该是对问题的回答。让其他人回答,最高的投票可以说是最好的方法。
  • 谢谢迈克尔,我接受了你的建议。

标签: groovy


【解决方案1】:

我找到了一种解决方案here。以下是对 TodoUser 的更改(注意:我已将列名更改为 'confirmation_uri'):

class TodoUser {
    Long id;
    String email;
    String password;
    String confirmationUri;
    boolean registered;

    def propertyMissing(String name, value) {
        if(isConfirmationUri(name)) {
            this.confirmationUri = value
        } else {
            unknownProperty(name)
        }
    }

    def propertyMissing(String name) {
        if(isConfirmationUri(name)) {
            return confirmationUri
        } else {
            unknownProperty(name)
        }
    }

    def isConfirmationUri(String name) {
        'confirmation_uri'.equals(name)
    }

    def unknownProperty(String name) {
        throw new MissingPropertyException(name, this.class)
    }
}

这按预期工作(在下面的手动测试中以及实际使用它从 GroovyRowResult 转换为 TodoUser 时):

TodoUser user = new TodoUser();

try {
    user.invalidProperty = 'http://blah.com'
} catch(MissingPropertyException e) {
    e.printStackTrace()
    Class type = e.getType()
    String prop = e.getProperty()
    println """Could not set the $prop property on type $type"""
}
user.confirmation_uri = 'http://blah.com'
println user.confirmationUri

这是一种方法。我认为这种方法没有任何问题(但也许我错了)。有没有更好的方法/这种方法有什么问题吗?

【讨论】:

    猜你喜欢
    • 2012-05-30
    • 2014-01-16
    • 2011-01-01
    • 2012-05-31
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多