0

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 : ''
    }
}

このアクションの間、データベース クエリは実行されないため、回避策はこのケースをカバーしません。抽象ドメイン クラスをコマンド オブジェクトとして使用するにはどうすればよいですか?

4

0 に答える 0