使用域类绑定在运行时评估GString

时间:2012-10-29 14:14:19

标签: grails groovy

我想存储一个绑定到域类的用户可配置GString,但是我遇到了一个问题,找不到合适的解决方案。

示例(概念/伪/不工作

class Person{
    ...

    String displayFooAs;  //<-- contains a java.lang.String like '${name} - ${address}'
}


class Foo{

    String name;
    String address;
    String city;

    public String getDisplayAs(def person){

        return doStuff(this, person.displayFooAs); //<-- Looking for something simple.

    }



}

更新:

经过审核,我认为这种灵活性会带来安全风险。它允许用户基本上将sql注入脚本写入'dispalyFooAs'。回到绘图板。

3 个答案:

答案 0 :(得分:1)

你的意思是:

public String getDisplayAs(def person){
  doStuff( this, person?.displayFooAs ?: "$name - $address" )
}

这在Groovy中有效,但我从未在Grails中将SimpleTemplateEngine嵌入到这样的内容中,因此需要进行大量测试以确保它按预期工作并且不会吞噬内存。

import groovy.text.SimpleTemplateEngine

class Person {
  String displayAs = 'Person $name'
}

class Foo {
  String name = 'tim'
  String address = 'yates'

  String getDisplayAs( Person person ) {
    new SimpleTemplateEngine()
          .createTemplate( person?.displayAs ?: '$name - $address' )
          .make( this.properties )
          .toString()
  }
}

def foo = new Foo()

assert foo.getDisplayAs( null )         == 'tim - yates'
assert foo.getDisplayAs( new Person() ) == 'Person tim'

答案 1 :(得分:0)

你已经定义了

private static final String DEFAULT_DISPLAY_AS = '${name} - ${address}'

静态最终 - 当然不起作用?

将其定义为封闭

private def DEFAULT_DISPLAY_AS = {->'${name} - ${address}'}

并拨打代码

DEFAULT_DISPLAY_AS()

答案 2 :(得分:0)

我需要类似的东西,我会在闭包循环中评估GString,因此模板引用它的属性值。我采用了上面的例子,并将其形式化为标准化的类,用于后期GString评估。

import groovy.text.SimpleTemplateEngine

class EvalGString {
    def it
    def engine

    public EvalGString() {
        engine = new SimpleTemplateEngine()
    }

    String toString(template, props) {
        this.it = props
        engine.createTemplate(template).make(this.properties).toString()        
    }
}    

def template = 'Name: ${it.name} Id: ${it.id}'
def eval = new EvalGString()

println eval.toString(template, [id:100, name:'John')
println eval.toString(template, [id:200, name:'Nate')

输出:

姓名:John Id:100

姓名:Nate Id:200