Русский English Тэги View Sergey Zolotaryov's profile on LinkedIn Вход
Как при инициализации spring бина получить contextPath
Постоянная ссылка 29-08-2007 anydoby java

Ответ: имплементировать ApplicationContextAware. Ответ правильный, но только в том случае, когда servletContext нужен при работе самого бина, а ежели он нужен в момент инициализации, еще до того, как были присвоены значения всех свойств?

Решение довольно несложное - нужно инжектировать его в конструктор. Но как? В spring не нашлось такого средства, поэтому пришлось написать самому:


package com.anydoby;

import javax.servlet.ServletContext;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.web.context.WebApplicationContext;

public class ApplicationContextHelper implements ApplicationContextAware {

  private WebApplicationContextctx;

  public void setApplicationContext(ApplicationContext ctx) throws BeansException {
    this.ctx = (WebApplicationContext)ctx;
  }
	
  public ServletContext getContext() {
    ServletContext servletContext = ctx.getServletContext();
    return servletContext;
  }
}

Это бин, в который инжектируется сервлет контекст. А теперь пример бина, которому нужен этот контекст:


public class SomeClass {

  public SomeClass(ServletContext ctx) {
    // do smth....
  }
}

и конфигурация всего этого в xml:


  <bean class="SomeClass">
    <constructor-arg>
      <bean сlass="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetObject">
          <bean сlass="com.anydoby.ApplicationContextHelper"></bean>    	
        </property>
        <property name="targetMethod" value="getContext"/>
      </bean>
    </constructor-arg>
  </bean>

вот и все :)

Добавить комментарий

Предыдущая статья Редактируемая страница в браузере Следующая статья Запрещенный метод в IE