Home > しらべる > SAStruts + JSONIC でバリデーションエラーをJSONで返す

SAStruts + JSONIC でバリデーションエラーをJSONで返す

  • Posted by: memorycraft
  • 2008年11月23日 06:54
  • しらべる

JSONのリクエストのパラメータをSAStrutsのバリデータで検証してNGだったらエラーメッセージ用のJSONオブジェクトを返す必要があったので、やってみました。


まず、検証メソッド

/**
 * JSON検証メソッドのサンプル
 * 検証せずにいきなりエラーを返す
 * メッセージのキーがJSONオブジェクトのキーになる
 * @return エラーメッセージ
 */
public ActionMessages validateFind() {
    ActionMessages errors = new ActionMessages();
    errors.add("test", new ActionMessage("msg", "こら!"));
    return errors;
}


普通の設定だとJSONが受け取れないので、JSON用のエラーアクションを用意します。これはActionクラスの親クラスに実装するか、JSONエラー用のActionクラスに実装して共通でつかうといいかも。

/**
 * JSON検証エラーハンドリング用のアクションメソッド
 * request, sessionの各スコープにエラーメッセージが存在していたら
 * それをJSONオブジェクトにセットして送信
 * @return JSONで返すのでnull
 * @throws IOException
 */
@Execute(validator = false)
public String jsonError() throws IOException{

	HttpServletRequest request = RequestUtil.getRequest();
       	HttpSession session = request.getSession();

       	Object msgRequest = request.getAttribute(Globals.ERROR_KEY);
       	Object msgSession = session.getAttribute(Globals.ERROR_KEY);

        Map<String, String> result = new HashMap<String, String>();
        if(msgRequest != null){
        	for (Iterator iter = ((ActionMessages)msgRequest).get(); iter.hasNext(); ) {
        		ActionMessage msg = (ActionMessage) iter.next();
        		result.put(msg.getKey(), (String)msg.getValues()[0]);
        	}
        }
        else{
        	for (Iterator iter = ((ActionMessages)msgSession).get(); iter.hasNext(); ) {
        		ActionMessage msg = (ActionMessage) iter.next();
        		result.put(msg.getKey(), (String)msg.getValues()[0]);
        	}
        }
		
	this.response.setContentType("text/javascript");
	this.response.setCharacterEncoding("UTF-8");
	this.response.getWriter().write(JSON.encode(result));
		
	return null;
}

で、実際にブラウザから呼び出されるアクション
@Executeで、検証メソッドとエラー時のForward先が定義されています。

/**
 * JSON検証サンプル用アクションメソッド
 * validateFindメソッドで検証した結果、NGならjsonErrorアクションにForwardして、エラー用JSONを返す。
 * @return
 * @throws IOException
 */
@Execute(validator = false, validate="validateFind", input="jsonError")
public String find() throws IOException {

	//... なんか処理とか

	this.response.setContentType("text/javascript");
	this.response.setCharacterEncoding("UTF-8");
	result.put("msg", "検証成功");
	this.response.getWriter().write(JSON.encode(result));
	return null;
}

これで、ブラウザのJSからfindに対してポストすると、結果のJSONオブジェクトのmsgには"検証成功"ではなく"こら!"が帰ってきます。

とりあえず、うまくいったんですが、これって一般的なやり方なんですかね?
みんなどうやってるんでしょうか?

Trackbacks:0

TrackBack URL for this entry
http://www.memorycraft.jp/mt-tb.cgi/84
Listed below are links to weblogs that reference
SAStruts + JSONIC でバリデーションエラーをJSONで返す from メモリークラフト

Comments:0

Comment Form

Home > しらべる > SAStruts + JSONIC でバリデーションエラーをJSONで返す

ページの先頭へ戻る