2013-02-15 14 views
15

jestem nowy z wiosny, a ja staram się używać adnotacji @Autowire dla ServletContext z mojego atrybutu klasy:Nie można Autowire ServletContext

@Controller 
public class ServicesImpl implements Services{ 

    @Autowired 
    ServletContext context; 

zdefiniowałem fasoli dla tej klasy w moim dyspozytor-servlet.xml:

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

Ale gdy próbuję uruchomić test JUnit to daje następujący błąd:

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)} 

Myślałem, że zastrzyk ServletContext był automatyczny ze sprężyną ... Jak mogę to rozwiązać?

Dzięki!

EDYCJA: Chcę użyć servletContext do wywołania metody getRealPath(). Czy jest jakaś alternatywa?

Odpowiedz

18

Wdrożenie interfejsu ServletContextAware i wiosna będzie wstrzyknąć go dla Ciebie

@Controller 
public class ServicesImpl implements Services, ServletContextAware{ 


private ServletContext context; 

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

Tak, jeśli pochodzi z JUNit, powinieneś użyć MockServletContext – ccheneson

+0

Przepraszamy za usunięcie posta, zdefiniowałem bean bean MockServletContext w moim test-context.xml, ale zmienna jest nadal pusta ... – qxlab

+0

Czy ładujesz kontekst testu. xml? – ccheneson

3

ServletContext nie jest fasolką szparagową i dlatego nie można go wstrzykiwać, chyba że wdrożono ServletContextAware.

Jeśli myśli się modułami lub warstwami, kontekst serwletu nie powinien być dostępny poza modułem/warstwą WWW. Przypuszczam, że Twoja ServicesImpl stanowi część warstwy biznesowej lub usługi.

Jeśli podasz trochę więcej szczegółów, możemy zaproponować lepsze alternatywy.

+2

Hi Marcel, staram się go używać, więc mogę wywołać metodę getRealPath dostać katalog główny. Jak inaczej mogę to osiągnąć? Dzięki! – qxlab

10

Prawdopodobnie będziesz chciał spojrzeć na MockServletContext, które mogą być użyte w testach jednostkowych.

+0

Ale jak z tego korzystać? Czy powinienem zdefiniować komponent bean w moim pliku test-context.xml w następujący sposób: ''? – qxlab

+0

Zdefiniowałem go i już nie dostaję żadnych błędów, ale zmienna kontekstowa ma wartość null ... – qxlab

+1

Jeśli użyjesz poniższego kodu, zostanie utworzony dla ciebie MockServletContext i będziesz mógł użyć @ Autowired w polu ServletContext. @ RunWith (SpringJUnit4ClassRunner.class) @ WebAppConfiguration @ ContextConfiguration (classes = {WebSpringConfiguration.class}) – tstorms

Powiązane problemy