2013-09-02 74 views
6

Tôi có một phương thức để xử lý một lớp ngoại lệ cụ thể trong môi trường Spring MVC. Các metod (giản thể) thực hiện sauExceptionHandler với ResponseBody: đặt ResponseStatus trong phần thân phương thức

@ExceptionHandler(AjaxException.class) 
@ResponseStatus(value=HttpStatus.BAD_REQUEST) 
@ResponseBody 
public Exception handleException(AjaxException ex) { 
    return ex; 
} 

Đây là hoạt động tốt, nhưng để trả về một ResponseStatus khác nhau tôi phải tạo ra một phương pháp xử lý mới.

Có thể thay đổi trạng thái phản hồi bên trong thân phương thức thay vì sử dụng chú thích @ResponseStatus mà không thay đổi kiểu trả về không?

Nếu không, có thể đạt được cùng một kết quả thay đổi kiểu trả về (có thể tự tuần tự hóa lớp ngoại lệ và trả về dưới dạng chuỗi)?

Trả lời

4

Thêm HttpServletResponse vào chữ ký phương thức và chỉ cần gọi phương thức setStatus.

@ExceptionHandler(AjaxException.class) 
@ResponseBody 
public Exception handleException(AjaxException ex, HttpServletResponse response) { 
    response.setStatus(HttpServletResponse.SC_BAD_REQUEST); 
    return ex; 
} 

Điều gì đó tương tự sẽ hoạt động.

+0

Chính xác! Tôi tìm thấy giải pháp này bản thân mình, nhưng ứng dụng vẫn tiếp tục chạy sai ... vấn đề là ở nơi khác – Gabber

2

Thực hiện dễ dàng, đọc tài liệu hướng dẫn mùa xuân cẩn thận hơn một chút.

Có thể vượt qua HttpServletResponse làm thông số đối tượng. Trong đối tượng đó có thể thiết lập mã trả về. Cú pháp như sau:

@ExceptionHandler(AjaxException.class) 
@ResponseBody 
public AjaxException handleException(AjaxException ex,HttpServletResponse response) { 
      //test code ahead, not part of the solution 

      //throw new NullPointerException(); 

      //end of test code 


    response.setStatus(404);//example 
    return ex; 
} 

Điều này sẽ trả về tuần tự hóa của trường hợp ngoại lệ cùng với mã trả về http được chỉ định.

EDIT: Tôi đã xóa câu trả lời này hôm qua vì giải pháp này dường như không hoạt động. Vấn đề là một mẹo nhỏ: khi bạn quản lý một ngoại lệ theo cách này, nếu phương thức được chú thích bằng ExceptionHandler sẽ ném một ngoại lệ, thì ngoại lệ được ném sẽ bị bỏ qua và ngoại lệ ban đầu sẽ được ném.

Mã của tôi bằng cách nào đó giống như giải pháp tôi đã đăng (nó đã ném ngoại lệ khi bắt đầu phương thức), vì vậy tôi không thể thấy đầu ra json, trình xử lý ngoại lệ chuẩn được kích hoạt thay thế. Để giải quyết tôi chỉ đơn giản là trycatched các trường hợp ngoại lệ ném và tất cả mọi thứ đã được ok.