- 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には"検証成功"ではなく"こら!"が帰ってきます。
とりあえず、うまくいったんですが、これって一般的なやり方なんですかね?
みんなどうやってるんでしょうか?
