Spring MVC и пользовательские теги - PullRequest
6 голосов
/ 16 января 2011

Я хочу использовать spring-bean в моих пользовательских taglibs в приложении spring-mvc. Потому что экземпляры TagLib не создаются весной, я не могу использовать инъекцию зависимостей.

Моей следующей мыслью было добавить к запросу Spring-контекст с помощью перехватчика и получить его из запроса в классе тегов.

Есть ли лучший способ использовать пружину в taglibs? Есть ли что-нибудь готовое к использованию весной? Если в spring-mvc еще нет поддержки customtag, есть ли способ заполнить существующий объект зависимостями?

public class MyTag extends TagSupport {
  @Autowired 
  private MyObject object;

  public void setMyObject(MyObject myObject) {
    this.myObject = myObject;
  }

  public int doEndTag() {
    ApplicationContext context = request.getAttribute("context");
    context.populate(this);

    return object.doStuff();
  }
}

Ответы [ 3 ]

3 голосов
/ 09 мая 2012

Наконец, рабочий способ сделать это состоял в том, чтобы объявить поля, которые должны быть инициированы пружиной, статическими и позволить инициировать один экземпляр Tag

public class MyTag extends TagSupport {
  private static MyObject myObject;

  @Autowired
  public void setMyObject(MyObject myObject) {
    MyTag.myObject = myObject;
  }

  public int doEndTag() {
    return object.doStuff();
  }

}

2 голосов
/ 08 апреля 2011

Вы должны предпочесть поместить эту логику в свой контроллер.Если вам действительно нужно это сделать, вы можете написать служебный класс для извлечения bean-компонентов из контекста приложения.

public class AppContextUtil implements ApplicationContextAware 
{
    private static final AppContextUtil instance = new AppContextUtil();
    private ApplicationContext applicationContext;

    private AppContextUtil() {}

    public static AppContextUtil getInstance() 
    {
        return instance;
    }

    public <T> T getBean(Class<T> clazz) 
    {
        return applicationContext.getBean(clazz);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException 
    {
        this.applicationContext = applicationContext;
    }
}

После этого вы сможете получить ваш bean-компонент следующим образом:

AppContextUtil.getInstance().getBean(MyObject.class);
0 голосов
/ 28 февраля 2012

В вашем контроллере поместите объект в модель.

Теперь объект можно найти в объекте HttpRequest, который является частью вашего тега.

Контроллер:

model.addAttribute("item", item);

Файл JSP:

 <%= ((com.content.CmsItem)(request.getAttribute("item"))).getId() %>

Если вам нужно выполнить автоматическое подключение, ознакомьтесь с моим решением по вопросу ', существует ли элегантный способ добавить управляемый бобом пружины в пользовательский / простой тег Java '

...