Struts2 JSON Plugin: добавление ActionMessages, ActionErrors и FieldErrors к ответу
Я создаю записи JQuery Ajax и хотел бы, чтобы в действии в ответ (в формате JSON) добавлены теги actionmessages
, actionerrors
и fielderrors
.
Я добавил этот результат:
<result name="input" type="json">
<param name="ignoreHierarchy">false</param>
<param name="includeProperties">fieldErrors,actionErrors</param>
</result>
для моей конфигурации действий в struts.xml
.
Я получаю: {"actionErrors":[],"fieldErrors":{}}
назад как ответ, несмотря на наличие полевых ошибок в стеке значений.
Если я изменил конфигурацию результатов на:
<result name="input" type="json">
<param name="ignoreHierarchy">false</param>
<param name="root">fieldErrors</param>
</result>
ожидается ответ JSON::
{"thePropertyWithValidationError":["You must supply correct information."]}
Мне бы очень понравились как ошибки действий, так и полевые ошибки, включенные в ответ, если это возможно.
Любые идеи? Большое вам спасибо заранее.
Edit:
Я думаю, мне, возможно, придется использовать какое-то регулярное выражение... Я пробовал:
<result name="input" type="json">
<param name="ignoreHierarchy">false</param>
<param name="includeProperties">fieldErrors\[\d+\],actionErrors\[\d+\]</param>
</result>
с тем же результатом:
{"actionErrors":[],"fieldErrors":{}}
Я также нашел этот отчет , который может способствовать моим проблемам, поскольку я использую Struts v2.2.1. (v2.2.2 еще не вышел)
Изменить # 2:
Возможно, JSONValidationInterceptor - это то, что мне нужно... Я не могу понять, как использовать его с моими пользовательскими сообщениями JQuery Ajax...
Я использую перехватчик json для заполнения моих свойств. Ниже приведена моя конфигурация действий:
<action name="MyAction" method="add" class="com.test.actions.MyAction">
<interceptor-ref name="json" />
<interceptor-ref name="jsonValidationWorkflowStack"/>
<interceptor-ref name="MyCustomInterceptor" />
<result name="success" type="json" />
</action>
Я публикую:
{"struts.enableJSONValidation":"true", "testProperty":"true"}
Ответ просто перенаправляется на мое глобальное сопоставление результатов, error.jsp(с ошибками поля, отображаемыми в том виде, в котором они установлены для отображения в error.jsp):
<global-results>
<result name="error">/WEB-INF/jsp/error.jsp</result>
<result name="Exception">/WEB-INF/jsp/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Throwable" result="Exception" />
</global-exception-mappings>
Я предполагаю, что ожидал, что если в стеке будут филдерсы /actionerrors, они будут возвращены как JSON?
Ответы
Ответ 1
Я понял, как вернуть ActionErrors, ActionMessages и FieldErrors в результат JSON!
Ниже приведен пример пакета - я установил глобальный обработчик ошибок, который выплевывает ошибки действий, ошибки полей и сообщения о действиях как JSON:
<!--myBase has interceptor stack defined-->
<package name="JsonResults" namespace="/json" extends="myBase">
<global-results>
<result name="input" type="json">
<param name="ignoreHierarchy">false</param>
<param name="includeProperties">actionErrors\[\d+\], fieldErrors\..+$, actionMessages\[\d+\]</param>
</result>
<result name="error" type="json">
<param name="ignoreHierarchy">false</param>
<param name="includeProperties">actionErrors\[\d+\], fieldErrors\..+$, actionMessages\[\d+\]</param>
</result>
<result name="Exception" type="json">
<param name="ignoreHierarchy">false</param>
<param name="includeProperties">actionErrors\[\d+\], fieldErrors\..+$, actionMessages\[\d+\]</param>
</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Throwable" result="Exception" />
</global-exception-mappings>
<!-- sample action -->
<action name="SampleAction" method="loadSamples" class="com.sample">
<result name="success" type="json">
<param name="ignoreHierarchy">false</param>
<param name="includeProperties">sampleComplexBean\[\d+\]\..+$, actionMessages\[\d+\]</param>
</result>
</action>
</package>
Я могу проверить свой JQuery Javascript, если существуют ошибки действий или ошибки поля:
/**
* Checks the passed in json and searches for the
* existence of an "actionErrors" or "fieldErrors" objects
*
* @param json The JSON to check for errors
* @returns {Boolean} true if errors exist; false otherwise
*/
function areActionOrFieldErrorInJson(json) {
var errorsExist = false;
if ( json != null && ( json.actionErrors != null || json.fieldErrors != null ) ) {
errorsExist = true;
}
return errorsExist;
}
или проведите через них следующим образом:
if ( json.actionErrors != null && json.actionErrors.length !== 0 ) {
$.each(json.actionErrors, function(e) {
doStuff(this);
});
}
Ответ 2
Параметр includeProperties можно немного сократить, используя:
<result name="error" type="json">
<param name="ignoreHierarchy">false</param>
<param name="includeProperties">
actionErrors.*,
actionMessages.*,
fieldErrors.*
</param>
</result>