Grails は、デフォルトでコマンド オブジェクトのプロパティとしてドメイン クラスをサポートします。Stuff
コマンドでドメイン クラスを使用できますが、抽象クラスのStuffCommand
場合は使用できません。Stuff
スタッフグルービー
abstract class Stuff{
}
StuffCommand.groovy
class StuffCommand{
Stuff stuff
}
ExampleController.groovy
class ExampleController{
def doStuffWithStuff(StuffCommand stuffCmd){
render stuffCmd.stuff ? stuffCmd.stuff as JSON : ''
}
}
次に、リクエストはデータベースhttp://server:port/ctx/example/doStuffWithStuff?stuff=123
のテーブルからレコード #123 を取得しません。stuff
私はそのアプローチの簡潔な性質が大好きです。データベースに対するクエリは実行されないか、サイレントに失敗します。
ただし、次の回避策が少し役立ちます。
ValueConverter
抽象 comain クラスに変換するクラスを作成します。クラス名は で終わる必要がありValueConverter
ますが、それ以外は自由に名前を付けることができますIdStringToStuffValueConverter
。
IdStringToStuffValueConverter
import org.grails.databinding.converters.ValueConverter
class IdStringToStuffValueConverter implements ValueConverter{
@Override
boolean canConvert(Object value) {
value instanceof String || value instanceof Integer || value instanceof Long
}
@Override
Object convert(Object value) {
return Stuff.get(value.toLong())
}
@Override
Class<?> getTargetType() {
return Stuff
}
}
これで、上記のリクエストを実行できるようになり、コントローラーはデータ バインディング中にデータベースに再度ヒットします。しかし、以下はまだ期待どおりに機能しません。
ExampleController.groovy
class ExampleController{
def doStuffWithStuff(Stuff stuff){
render stuff ? stuff as JSON : ''
}
}
このアクションの間、データベース クエリは実行されないため、回避策はこのケースをカバーしません。抽象ドメイン クラスをコマンド オブジェクトとして使用するにはどうすればよいですか?