Не удается Autowire ServletContext

Я новичок в Spring, и я пытаюсь использовать аннотацию @Autowire для ServletContext с моим атрибутом class:

@Controller
public class ServicesImpl implements Services{

    @Autowired
    ServletContext context;

Я определил bean для этого класса в моем диспетчере-servlet.xml:

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

Но когда я пытаюсь запустить JUnit-тест, он дает следующую ошибку:

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

Я думал, что инъекция ServletContext была автоматической с помощью spring... Как я могу это решить?

Спасибо!

EDIT: я хочу использовать servletContext для вызова метода getRealPath(). Есть ли альтернатива?

Ответы

Ответ 1

Внедрите ServletContextAware интерфейс и Spring введет его для вас

@Controller
public class ServicesImpl implements Services, ServletContextAware{


private ServletContext context;

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

Ответ 2

Вероятно, вы захотите взглянуть на MockServletContext, который можно использовать в модульных тестах.

Ответ 3

ServletContext не является Spring bean, и поэтому его нельзя вводить, если вы не реализуете ServletContextAware.

Если кто-то думает в модулях или слоях, контекст сервлета не должен быть доступен вне веб-модуля/уровня. Я полагаю, что ваш ServicesImpl является частью бизнес-уровня или уровня сервиса.

Если вы дадите немного больше контекста, мы сможем предложить лучшие альтернативы.