1

ドメインクラスにバインドされるユーザー設定可能なGStringを保存したいのですが、これに対する適切な解決策を見つけるのに問題があります。

例(concept / pseudo / non-working

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.

    }



}

アップデート:

レビューの結果、この種の柔軟性はセキュリティリスクをもたらすと判断しました。これにより、ユーザーは基本的に「dispalyFooAs」へのSQLインジェクションをスクリプト化できます。ふりだしに戻る。

4

3 に答える 3

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'
于 2012-10-29T15:05:57.280 に答える
0

定義しました

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

静的最終的な-もちろんそれは機能しませんか?

クロージャーとして定義する

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

コードを呼び出す

DEFAULT_DISPLAY_AS()
于 2012-10-29T14:24:39.913 に答える
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')

出力:

名前:ジョンID:100

名前:ネイトID:200

于 2013-01-31T10:01:14.610 に答える