我希望在响应JSON格式时处理异常,例如“请求方法POST / GET不支持”,而不是错误页面。
原因是abc.com/api/之后的任何网址都是我的API网址,但我不知道如何抓住并处理上述异常。
这是我的控制器:
@RequestMapping(value="/register", method=RequestMethod.POST)
@ResponseBody
public ApiBaseResp register(@RequestBody RegisterReq req , HttpServletResponse res) throws RestException {
}
当我使用GET调用abc.com/api/register时,它会抛出错误页面,说“请求方法GET不受支持”,这是正确的。但我想要一个JSON格式的友好错误处理程序,如:
{
"code" : "99",
"message" : "Request MEthod GET not supported"
}
这是我的abc-servlet.xml:
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver"
p:order="1" />
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" p:order="2">
<property name="exceptionMappings">
<props>
<prop
key="com.abc.framework.common.exception.NoPrivilegeException">noPrivilege</prop>
<prop key="java.lang.Exception">error</prop>
<prop
key="com.abc.framework.common.exception.CustomGenericException">customError</prop>
</props>
</property>
</bean>
我用谷歌搜索但似乎无法找到解决方案。也许我的关键字不正确。直截了当,希望有经验的人能解决我的问题。 提前谢谢。
答案 0 :(得分:3)
您可以创建一个名为DefaultExceptionHandler
的类来捕获任何异常并返回您想要的任何内容(例如:在此示例中为RestError
)
@ControllerAdvice
public class DefaultExceptionHandler {
@ExceptionHandler(value = HttpRequestMethodNotSupportedException.class)
public ResponseEntity<?> methodNotSupportErrorHandler(HttpServletRequest req, Exception e) throws Exception {
RestError error = new RestError("BadRequestException", 400, "Method not supported");
return new ResponseEntity<RestError>(response, HttpStatus.BAD_REQUEST);
}
}
@JsonPropertyOrder(value = {"error_type", "code", "error_message"})
public class RestError {
@JsonProperty("code")
int code;
@JsonProperty("error_type")
String type;
@JsonProperty("error_message")
String message;
public RestError() {
super();
}
public RestError(String type, int code, String message) {
this.code = code;
this.type = type;
this.message = message;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
要了解有关如何处理Spring MVC中的异常的更多信息,请阅读以下文章:Exception Handling in Spring MVC
答案 1 :(得分:0)
我建议以下面的方式解决这个问题。
创建interceptor
,并通过此方式传递请求,覆盖preHandle
和postHandle
方法,然后从postHandle
根据您的选择准备回复
或者您可以创建Filter
,然后您可以检查HTTP状态代码,然后修改response
消息。