У меня есть действия Struts2 с различными типами результатов (HTML и JSON). Они используют общий перехватчик. Если нужно перехватить запрос, как вернуть результат на основе заданного типа результата действия?
Например, мой Action.ERROR перешел на страницу JSP. Если действие типа JSON, я хочу переслать JSON-ошибку. Пожалуйста посоветуй.
Хотя это правда, что действие не имеет ни тип, это также верно, что, если действие вызывается в пути AJAX, как действие возвращения JSON, все его результаты должны иметь то же самое тип результата (JSON в этом случае), если только вы не используете одно действие для выполнения различных логических действий (операции ajax и non-ajax, то есть анти-шаблон);
Тем не менее, если вы хотите, чтобы вернуть правильный GLOBAL результата ошибки из внутри перехватчика, который используется все ваши действий (каждый со своим типом результата), основываясь на их другого результата типа (скажем: SUCCESS
, предполагая, что каждое действие имеет SUCCESS
результат), это способ сделать это:
public String intercept(ActionInvocation invocation) throws Exception {
// Get the action configuration defined in struts.xml
ActionConfig config = invocation.getProxy().getConfig();
// Get the SUCCESS result configured for that Action
ResultConfig success = config.getResults().get("success");
// Get the class of the SUCCESS result
Object clazz = success.getClass();
/* .... oops, some error occurred !!
We now need to redirect to the right global error result .... */
if (clazz instanceof org.apache.struts2.dispatcher.ServletDispatcherResult) {
log.debug("Struts2 Result type: CLASSIC");
return "error";
} else if (clazz instanceof org.apache.struts2.json.JSONResult) {
log.debug("Struts2 Result type: JSON");
return "jsonError";
} else {
log.debug("Struts2 Result type: SOMETHING ELSE, returning default ");
return "error";
}
}
Хотя это технически возможно, я бы отговорить его, потому что ...нет реальной причины для этого;
Для вашей цели, помните, что каждый глобальный результат является областью действия в<package>
;
Так как вы могли бы (/ должен) иметь два различные пакеты для классических действий (а <package>
расширения struts-default
) и JSON действий (а <package>
простирающихся json-default
), вы можете просто определить два различных результат глобальной ошибки для каждого пакета с тем же имя, но другой тип результата; таким образом, Interceptor будет вызывать один, относящийся к пакету текущего Action, выводя желаемый результат.
Как вы определяете, является ли действие «типом JSON»? Вы можете получить код результата в 'PreResultListener', но действия должны быть отделены от их результатов, это своего рода точка шаблона. Другие варианты, включая проверку запроса. –