控制器SpringMVC上的错误处理

时间:2016-07-04 13:26:22

标签: spring spring-mvc error-handling runtime-error

我正在使用jax-rs和spring mvc开发一个应用程序。 我想在每次发生默认错误时通知我的客户端 400,403,404,405和415。

控制器

    @Controller
    @RequestMapping("/customer")
    public class CustomerController {

        @Autowired
        CustomerService customerService;

        // ........xxxxxx..............xxxxxxx................xxxxxxx.............//


            @CrossOrigin
            @RequestMapping(value = "/", 
                            method = RequestMethod.GET, 
                            produces = MediaType.APPLICATION_JSON_VALUE)
            public @ResponseBody String fetchCustomer() throws JsonProcessingException {
                return new ObjectMapper().writeValueAsString(customerService.fetchAllCustomer());
            }

            // ........xxxxxx..............xxxxxxx................xxxxxxx.............//

}  

客户端

$http({
        method: "GET",
        contentType: "application/json",
        url: baseUrl + '/customer'
      }).success(function (response) {
        console.log(response);
        // you can also use
        console.log(JSON.stringify(response);
      }).error(function (response) {
        console.log(response);
      });

当我从客户端请求服务时,我希望使用状态代码和自定义消息发回响应。

实施例

当我在控制器上定义method = post并从客户端发送请求时,我发送请求作为获取服务应返回

之类的消息
error:{
     Status Code: 405,
     Message:  Invalid Method 
     url: error/405
}

2 个答案:

答案 0 :(得分:0)

检查this以供参考。

定义处理特定错误场景的方法,并将其注释为@ExceptionHandler。您的方案中的例外(不支持请求方法)是HttpRequestMethodNotSupportedException.class。您可以使用Throwable, Exception等创建更通用的处理程序方法。

为了防止跨控制器重复错误处理,一种方便的方法是在单个类中定义所有处理程序并在其上使用@ControllerAdvice。这样,所有处理程序都将应用于所有控制器。

答案 1 :(得分:0)

不要返回String但返回org.springframework.http.ResponseEntity。 您可以向此对象添加状态代码

ResponseEntity<String> responseEntity = new ResponseEntity<String>("This is a response", HttpStatus.INTERNAL_SERVER_ERROR);
return responseEntity;

所以你的方法签名也会改变如下

    @RequestMapping(value = "/", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody ResponseEntity<String> fetchCustomer() throws JsonProcessingException {
        try {
            String str = new ObjectMapper().writeValueAsString(customerService.fetchAllCustomer());
            return new ResponseEntity<String>(str, HttpStatus.OK);
         }
        catch (Exception e) {
             return new ResponseEntity<String>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

如果出现错误,您可以使用控制器建议或捕获异常并适当更新ResponseEntity