есть ли элегантный способ внедрить управляемый bean-компонент spring в пользовательский/простой тег java

У меня есть куча пользовательских тегов java, которые используют управляемые bean-компоненты Spring. Поскольку я не могу найти способ вставки в пользовательский тег, я создал вспомогательный класс, который предоставляет статические методы для "getTheObjectINeedBean()" для всех объектов bean-компонентов Spring, которые я нужно.. Мне такой подход совсем не нравится.

я действительно хочу иметь возможность вводить управляемый bean-компонент Spring в пользовательский тег

Есть ли способ? Что касается моего исследования, я понимаю, что это невозможно сделать, потому что пользовательский тег управляется контейнером.

Спасибо,

Билли


person Billworth Vandory    schedule 10.08.2010    source источник
comment
Дубликат stackoverflow.com/questions/1296052/   -  person skaffman    schedule 10.08.2010


Ответы (3)


Вы правы, нет простого способа использовать внедрение зависимостей в теги jstl, потому что они не управляются Spring и не могут быть. Однако есть (по крайней мере) два обходных пути:

Ни один из вариантов не идеален, поскольку требует либо дополнительного кода, либо некоторой «черной магии».

person Bozho    schedule 10.08.2010

Чтобы расширить сообщение @Bozho, я заставил это работать так: (весной 3.0 нет ApplicationContextUtils, который я мог бы найти)

public class LocationTag extends RequestContextAwareTag {
    @Autowired
    PathComponent path;

...
    @Override
    protected int doStartTagInternal() throws Exception {
        if (path == null) {
            log.debug("Autowiring the bean");
            WebApplicationContext wac = getRequestContext().getWebApplicationContext();
            AutowireCapableBeanFactory acbf = wac.getAutowireCapableBeanFactory();
            acbf.autowireBean(this);
        }
        return SKIP_BODY;
    }
}
person Angus    schedule 02.03.2012
comment
Спасибо, getRequestContext().getWebApplicationContext() решил мою проблему - person TrueCoke; 05.01.2013

Решение, описанное выше, работает, но некоторая предыстория и дополнительные фрагменты кода, скорее всего, будут полезны.

1) Метод doStartTagInternal вызывается из метода doStartTag. 2) Я был вынужден сначала установить pageContext перед вызовом doStartTag 3) Я выполнил поиск bean-компонента, а не автопроводку. Мне это кажется более простым: (YourBeanProxy) autowireCapableBeanFactory.getBean("yourBeanName")

Надеюсь, эта дополнительная информация окажется полезной.

person Wim Van den Brande    schedule 18.06.2015