Spring如何处理Restful API的“请求方法POST不支持”错误

时间:2015-05-26 02:28:15

标签: spring error-handling

我希望在响应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>

我用谷歌搜索但似乎无法找到解决方案。也许我的关键字不正确。直截了当,希望有经验的人能解决我的问题。 提前谢谢。

2 个答案:

答案 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)

我建议以下面的方式解决这个问题。

  1. 创建interceptor,并通过此方式传递请求,覆盖preHandlepostHandle方法,然后从postHandle根据您的选择准备回复

  2. 或者您可以创建Filter,然后您可以检查HTTP状态代码,然后修改response消息。