2013-08-21 45 views
12

Tôi gặp sự cố khi nhận được @ControllerAdvice để hoạt động. Tôi đã cập nhật vị trí không gian tên của mình, là 3,1 trong tệp xml của tôi. Tôi di chuyển lớp với bộ điều khiển đến cùng một gói với bộ điều khiển. Tôi đang sử dụng các lọ phát hành 3.2.0. Nếu tôi đặt chú thích @ExceptionHandler trong mã bộ điều khiển, nó hoạt động, nhưng không phải trong một lớp riêng biệt với @ControllerAdvice. Khi lớp @ControllerAdvice không thành công, tôi có được khung nhìn xử lý ngoại lệ chưa được nắm bắt của mình. Bất cứ ai có ý tưởng về làm thế nào để rắc rối bắn này?Mùa xuân 3.2 @ControllerAdvice Không hoạt động

+1

Bạn có thể giải quyết vấn đề này không? Tôi đang chạy vào cùng một vấn đề bạn đang có. –

Trả lời

14

Nếu bạn sử dụng chức năng quét classpath, có lẽ bạn phải thêm mới bao gồm bộ lọc để <context:component-scan> yếu tố của bạn:

<context:include-filter type="annotation" 
    expression="org.springframework.web.bind.annotation.ControllerAdvice" /> 

Mặc định quét không tra cứu chú thích này, sau mùa xuân-context-3.2.xsd cho component-scan:

"Quét đường dẫn lớp cho các thành phần được chú thích sẽ được tự động đăng ký làm hạt mùa xuân. Theo mặc định, các khuôn mẫu Spring-provided @Component, @Repository, @Service và @Controller sẽ được phát hiện".

+0

Điều đó có ý nghĩa tại sao nó không hoạt động. Tôi sẽ kiểm tra nó tối nay và xem nó có hoạt động không. – Joe

+0

CHIA SẺ! Nó hoạt động ra khỏi hộp, nhưng chú thích này là cần thiết khi bạn đang thử nghiệm đơn vị! – Chexpir

+2

Cũng đảm bảo rằng đây là tệp ngữ cảnh webmvc chứ không phải ngữ cảnh ứng dụng chính. –

7

Đối với vấn đề này, điều đầu tiên là xác nhận cấu hình của bạn,

  1. Bạn cần chắc chắn rằng lớp @ControllerAdvice dưới gói cơ sở thành phần quét của bạn.
  2. Làm cho suer bạn sử dụng <mvc:annotation-driven/> trong spring-servlet.xml của bạn. hoặc có @EnableWebMvc trong @ControllerAdvice Class

Khi bạn có cấu hình đúng, ControllerAdvice đã hoạt động, Bây giờ bạn đã nói Bạn đã có chế độ xem xử lý ngoại lệ chưa được nắm bắt của mình. Tôi đoán bạn đã nhận rằng trong InegrationTest của bạn, Và bạn sử dụng mockMvc để kiểm tra rằng, Nếu vậy, bạn cần đặt @WebAppConfiguration và xây dựng mokcMvc như sau:

@Autowired 
private WebApplicationContext wac; 

mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); 

Sử dụng standaloneSetup (controller) sẽ không làm việc vì thiếu WebApplicationContext .

+0

Trong trường hợp của tôi @EnableWebMvc là đủ –

+0

Bạn cũng có thể thêm lớp ControllerAdvice trong standaloneSetup: 'MockMvcBuilders.standaloneSetup (new MyController (myService)) .setControllerAdvice (new MyControllerAdvice()). Build();' –

2

Tôi đã gặp khó khăn với cùng một vấn đề mà lớp @ControllerAdvice của tôi sẽ không tải khi kiểm tra đơn vị các ngoại lệ của trình điều khiển REST. Nếu bạn đang sử dụng khởi động mùa xuân (phiên bản 4) thì bạn có thể sử dụng các phương thức bổ sung được thêm vào bởi lò xo để tải các lớp tư vấn điều khiển trong thiết lập độc lập các bộ điều khiển của bạn.

mockMvc = MockMvcBuilders.standaloneSetup(new YourRestController().setControllerAdvice(new ControllerAdviceClass()).build(); 

Điều này sẽ ngay lập tức khởi tạo lớp tư vấn điều khiển và kiểm tra Junit của bạn sẽ có thể chuyển sang phương thức @ExceptionHandler được xác định trong lớp tư vấn điều khiển của bạn.

0

Đối với tôi, @ControllerAdvice không hoạt động bằng mọi giá. Ngay cả việc thêm @EnableWebMvc hoặc @WebAppConfiguration không thực hiện bất kỳ thay đổi nào.

Con đường tôi đã có thể làm cho nó làm việc là,

  • thêm @ExceptionHandler phương thức của lớp AbstractController của tôi, lớp mà tất cả các bộ điều khiển khác được mở rộng theo.

Tôi nghĩ @ControllerAdvice là nghĩa vụ phải làm điều tương tự, ví dụ: biên dịch @ExceptionHandler phương pháp xác định theo quy định của lớp @ControllerAdvice, thành một nơi phổ biến nơi mỗi bộ điều khiển có thể tham khảo từ. Nhưng tiếc là nó không làm việc cho tôi.

Các vấn đề liên quan