12

質問:request.JSONデータを使用してコマンドオブジェクトの自動バインドを行う方法はありますか?

私のgrailsコントローラーにこの単純なCommandオブジェクトがあるとすると、次のようになります。

class ProfileCommand{

int id
String companyName

static constraints = {
    companyName blank: false
    id nullable: false
}

@Override
public String toString() {
    return "ProfileCommand{id=$id, companyName='$companyName'}";
}
}

と私のコントローラーメソッドの署名:

def update(ProfileCommand command) {...}

request.JSONコマンドオブジェクトにデータを取り込むにはどうすればよいですか?

これまでのところ、私がそれを行うことができた唯一の方法は、update()メソッド内でコマンドオブジェクトを手動で作成し、コンストラクター引数としてrequest.JSONを渡すことです。

    def command = new ProfileCommand(request.JSON)

    log.debug "Command object contents: $command"

上記のdebugコマンドは以下を生成します。

Command object contents: ProfileCommand{id=1, companyName='Blub Muckers'}

これはまさに私が望んでいることです(上記の解決策についてOliver Tynesに大声で叫びます)。command.validate()残念ながら、コマンドを作成した後に呼び出すと、次の例外が発生します。

Class org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException
Message Tag [validate] is missing required attribute [form]

私はv2.0.3を使用していますが、URIはv2.0.4で同じ例外を生成しました。

UPDATEgrails メーリングリストのIanRobertsによると、@Validateableさせるには、コマンドクラスにアノテーションをvalidate()。ありがとう、イアン!

4

3 に答える 3

7

自動JSONパラメーターデータバインディングを実行するための構成上の問題があるかどうかはわかりません。実行できる可能性のあることの1つは、基本的にrequest.JSONをルートパラメーターマップに直接再マップするJSONリクエスト入力を受け取るアクションのフィルターを作成することです。これにより、理論的には自動データバインディングを実行できるようになります。

何かのようなもの:

class JSONParamMapFilters {
  def filters = {
     before = {
        remapFilter(controller:'yourController', action:'update') {
           request.JSON.each { k,v ->
               params[k] = v
           }
        }
     }
  }
}

次に、このフィルターを正規表現/命名規則を介して、該当するコントローラーアクションに拡張できます。

于 2012-05-31T13:50:47.970 に答える
4

parseRequest=trueで使用する必要がありますUrlMappings.groovy。例えば:

"/user/$id/$action?"(controller: "userProfile", parseRequest: true) {
    constraints {
        id matches: /^[0-9]+$/
    }
}

次に、変数を使用paramsするか、メソッド引数でjsonをコマンドオブジェクトにバインドします。

def index(MyCommand command){...}

両方とも機能するはずです。ただし、場合によっては、json(マップへのバインド)から一部の情報が失われます。

于 2013-01-28T08:22:44.643 に答える
1

コマンドオブジェクトをコントローラーアクションのパラメーターとして使用していない場合、Grailsはvalidateメソッドを使用してコマンドオブジェクトを自動的に拡張しません。クラスに@Validateableアノテーションを付けて、Grailsに拡張する必要があることを伝える必要があります。

http://grails.org/doc/latest/guide/validation.html#validationNonDomainAndCommandObjectClasses

于 2012-05-31T15:22:38.810 に答える