2013-02-15 39 views
15

Tôi mới với mùa xuân, và tôi đang cố gắng sử dụng các chú thích @Autowire cho ServletContext với thuộc tính lớp của tôi:Không thể Autowire ServletContext

@Controller 
public class ServicesImpl implements Services{ 

    @Autowired 
    ServletContext context; 

tôi xác định đậu cho lớp này trong tôi phối-servlet.xml:

<bean id="services" class="com.xxx.yyy.ServicesImpl" /> 

Nhưng khi tôi cố gắng chạy một thử nghiệm JUnit nó mang lại cho các lỗi sau:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [javax.servlet.ServletContext] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

Tôi nghĩ rằng việc tiêm ServletContext là tự động với mùa xuân ... Làm thế nào tôi có thể giải quyết điều này?

Cảm ơn!

EDIT: Tôi muốn sử dụng servletContext để gọi phương thức getRealPath(). Có cách nào khác không?

Trả lời

18

Thực hiện giao diện ServletContextAware và mùa xuân sẽ bơm nó cho bạn

@Controller 
public class ServicesImpl implements Services, ServletContextAware{ 


private ServletContext context; 

public void setServletContext(ServletContext servletContext) { 
    this.context = servletContext; 
} 
+0

Có, Nếu nó từ JUNit, bạn nên sử dụng MockServletContext – ccheneson

+0

Xin lỗi vì xóa bài đăng, tôi đã xác định bean MockServletContext trong tệp test-context.xml của tôi nhưng biến vẫn là null ... – qxlab

+0

Bạn đang tải ngữ cảnh thử nghiệm. xml? – ccheneson

3

ServletContext không phải là Spring bean và do đó, nó không thể được tiêm trừ khi bạn triển khai ServletContextAware.

Nếu một người nghĩ trong các mô-đun hoặc các lớp thì ngữ cảnh servlet không nên có sẵn bên ngoài mô đun/lớp web. Tôi giả sử bạn ServicesImpl là một phần của lớp kinh doanh hoặc dịch vụ.

Nếu bạn cung cấp thêm một chút ngữ cảnh, chúng tôi có thể đề xuất các lựa chọn thay thế tốt hơn.

+2

Hi Marcel, tôi đang cố gắng để sử dụng nó để tôi có thể gọi phương thức getRealPath để có được thư mục gốc. Làm cách nào khác tôi có thể thực hiện việc này? Cảm ơn! – qxlab

10

Có thể bạn sẽ muốn xem MockServletContext có thể được sử dụng trong các bài kiểm tra đơn vị.

+0

Nhưng làm cách nào để sử dụng? Tôi có nên chỉ định nghĩa bean trong tệp test-context.xml của mình như sau: ''? – qxlab

+0

Tôi đã định nghĩa nó và tôi không nhận được bất kỳ lỗi nào nữa nhưng biến ngữ cảnh là null ... – qxlab

+1

Nếu bạn sử dụng mã bên dưới, MockServletContext được tạo cho bạn và bạn sẽ có thể sử dụng @ Autowired trên trường ServletContext của bạn. @ RunWith (SpringJUnit4ClassRunner.class) @ WebAppConfiguration @ ContextConfiguration (lớp = {WebSpringConfiguration.class}) – tstorms

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