
[英]Can Prototype or JQuery return an HTTP status code on an AJAX request
[英]How can I return an error message and HTTP status code that calls jQuery AJAX error function?
使用Spring,我有一个SimpleMappingExceptionResolver,可以在resolveException方法中捕获应用程序中的任何意外异常。 在该方法中,我返回一个ModelAndView,它将错误消息文本提供给HTTP客户端。 这是代码:
public class UnExpectedExceptionResolver extends SimpleMappingExceptionResolver {
private Log logger = LogFactory.getLog(this.getClass().getName());
private ResourceBundleMessageSource messageSource;
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) {
// let the end user know that an error occurred
Locale locale = RequestContextUtils.getLocale(request);
String messageText = messageSource.getMessage("systemError", null, locale);
Message message = new Message(messageText, MessageType.ERROR);
ModelAndView mav = new ModelAndView();
mav.setView(new MappingJacksonJsonView());
mav.addObject("message", message);
return mav;
}
因此,响应将返回HTTP状态代码200,响应文本为消息(JSON)。 不幸的是,客户认为这是一个有效的响应,因为200代码并试图处理它。 我尝试将HTTP状态代码设置为500,如下所示:
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Server Error");
就在之前
return mav;
声明。 不幸的是,这会返回一个HTML页面,指示内部错误而不是我的JSON消息。 如何返回JSON消息并仍向客户端指示服务器错误(或某种类型的错误)? 具体来说,我希望调用AJAX调用中的客户端错误函数,并将消息数据发送回客户端。 仅供参考 - 我在客户端使用jQuery。
我不知道你是如何向服务器发出请求的。 但这就是我要做的。
@ExceptionHandler(Exception.class)
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR, reason = "your message")
public void handleException(IllegalStateException ex, HttpServletResponse response) throws IOException
{
}
在客户端
$.ajax({
type : "POST",
url : urlString,
data : params,
dataType : 'json',
success : function(data) {
// do something}
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status); //This will be 500
alert(xhr.responseText); // your message
//do stuff
}
在Spring 3.2中,您可以将异常处理程序放在@ControllerAdvice
注释类中。
使用
@ControllerAdvice
注释的类可以包含@ControllerAdvice
@ExceptionHandler
,@ControllerAdvice
@InitBinder
和@ModelAttribute
方法,这些方法将应用于跨控制器层次结构的@RequestMapping
方法,而不是声明它们的控制器层次结构。@ControllerAdvice
是一个组件注释,允许通过类路径扫描自动检测实现类。
因此,如果通过自动扫描@Controller
注释类来获取控制器, @ControllerAdvice
ControllerAdvice也应该工作(如果使用显式注释表达式扫描@Controller
类,则可能需要单独注册此bean)。
@ControllerAdvice
public class AppControllerAdvice{
@ExceptionHandler(Throwable.class)
ResponseEntity<String> customHandler(Exception ex) {
return new ResponseEntity<String>(
"Custom user message",
HttpStatus.INTERNAL_SERVER_ERROR);
}
请注意,文本是返回实体的一部分,而不是 HTTP原因短语。
我就是这样做的。
public class CustomExceptionResolver extends AbstractHandlerExceptionResolver {
private static final Logger logger = Logger.getLogger(CustomExceptionResolver.class);
protected ModelAndView doResolveException(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) {
try {
response.reset();
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
response.setCharacterEncoding("UTF-8");
response.setContentType("text/json");
MappingJacksonJsonView view = new MappingJacksonJsonView();
Map<String, String> asd = new HashMap<String, String>();
asd.put("message", ex.getMessage());
view.setAttributesMap(asd);
return new ModelAndView(view);
} catch (Exception e) {
logger.error("send back error status and message : " + ex.getMessage(), e);
}
return null;
}
然后当然在我的json-servlet.xml文件中:
<bean id="exceptionResolver" class="com.autolytix.common.web.CustomExceptionResolver"/>
将以下代码添加到frontcontrol
@ExceptionHandler(Exception.class)
public @ResponseBody
MyErrorBean handleGeneralException(Exception e,
HttpServletRequest request, HttpServletResponse response) {
logger.info("Exception:" , e);
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
MyErrorBean errorBean = new MyErrorBean();
errorBean.setStatus(MyConstants.ERROR_STATUS);
return errorBean;
}`
由于您使用的是JSON,我假设您将在代码中配置一个messageconverter,将其转换为JSON。 通过设置状态并发送bean,您将能够解决它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.