JSOnValidationInterceptorのバグで、返されたjsonデータが注釈された
3375 ワード
/*{"fieldErrors":{"password":["パスワード長3-20文字"}}}*/
チェックアウトエラー時にJSOnValidationInterceptorが返してくれた結果、なんと/*{}*/に囲まれていました.
このような問題は、JQueryのようなajaxフレームワークを使用する場合、戻りデータ型dataType=jsonが設定されていると、jQueryは戻り文字列がjsonオブジェクトとして自動的に解析され、不運なことに、非良構造のjson文字列がjQueryに無視され、コールバック法が永遠に実行されないということである.
buildResponseメソッドで、ソースコード検出の問題を表示します.
どうぞご覧ください
および
これは確かにバグで、開発者がわざとやったのではなく、struts 2にある.2.2 fixに落とされます.
http://struts.1045723.n5.nabble.com/jira-Created-WW-3545-JSONValidationInterceptor-Returns-Invalid-quot-true-quot-json-Do-not-put-javascn-td3550970.html
2.2.2以前のバージョンしか使えない場合は、このinterceptorを再カスタマイズし、上のコードを
および
できます.
チェックアウトエラー時にJSOnValidationInterceptorが返してくれた結果、なんと/*{}*/に囲まれていました.
このような問題は、JQueryのようなajaxフレームワークを使用する場合、戻りデータ型dataType=jsonが設定されていると、jQueryは戻り文字列がjsonオブジェクトとして自動的に解析され、不運なことに、非良構造のjson文字列がjQueryに無視され、コールバック法が永遠に実行されないということである.
buildResponseメソッドで、ソースコード検出の問題を表示します.
protected String buildResponse(ValidationAware validationAware) {
//should we use FreeMarker here?
StringBuilder sb = new StringBuilder();
sb.append("/* { ");
if (validationAware.hasErrors()) {
//action errors
if (validationAware.hasActionErrors()) {
sb.append("\"errors\":");
sb.append(buildArray(validationAware.getActionErrors()));
}
//field errors
if (validationAware.hasFieldErrors()) {
if (validationAware.hasActionErrors())
sb.append(",");
sb.append("\"fieldErrors\": {");
Map<String, List<String>> fieldErrors = validationAware
.getFieldErrors();
for (Map.Entry<String, List<String>> fieldError : fieldErrors
.entrySet()) {
sb.append("\"");
//if it is model driven, remove "model." see WW-2721
sb.append(validationAware instanceof ModelDriven ? fieldError.getKey().substring(6)
: fieldError.getKey());
sb.append("\":");
sb.append(buildArray(fieldError.getValue()));
sb.append(",");
}
//remove trailing comma, IE creates an empty object, duh
sb.deleteCharAt(sb.length() - 1);
sb.append("}");
}
}
sb.append("} */");
/*response should be something like:
* {
* "errors": ["this", "that"],
* "fieldErrors": {
* field1: "this",
* field2: "that"
* }
* }
*/
return sb.toString();
}
どうぞご覧ください
sb.append("/* { ");
および
sb.append("} */");
これは確かにバグで、開発者がわざとやったのではなく、struts 2にある.2.2 fixに落とされます.
http://struts.1045723.n5.nabble.com/jira-Created-WW-3545-JSONValidationInterceptor-Returns-Invalid-quot-true-quot-json-Do-not-put-javascn-td3550970.html
2.2.2以前のバージョンしか使えない場合は、このinterceptorを再カスタマイズし、上のコードを
sb.append(" { ");
および
sb.append(" } ");
できます.