我想在spring-mvc应用程序中的自定义taglibs中使用spring-beans。原因TagLib-Instances没有被spring实例化,我不能使用dependnecy-injection。
我的下一个想法是通过拦截器将spring-context添加到请求中,并在tag-class中从请求中获取它。
有没有更好的方法在taglibs中使用spring?春天有什么东西可以随时使用吗?如果spring-mvc中还没有customtag-support,是否有办法用依赖项填充现有对象?
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();
}
}
答案 0 :(得分:3)
最后,执行此操作的方法是将spring应该由spring启动的字段声明为static,然后启动一个Tag-instance
public class MyTag extends TagSupport {
private static MyObject myObject;
@Autowired
public void setMyObject(MyObject myObject) {
MyTag.myObject = myObject;
}
public int doEndTag() {
return object.doStuff();
}
}
答案 1 :(得分:2)
您应该更喜欢将该逻辑放入控制器中。如果你真的需要这样做,你可以编写一个实用程序类来从应用程序上下文中检索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);
答案 2 :(得分:0)
在控制器中,将对象放入模型中。
现在可以在作为标记一部分的HttpRequest对象中找到该对象。
控制器:
model.addAttribute("item", item);
Jsp文件:
<%= ((com.content.CmsItem)(request.getAttribute("item"))).getId() %>
如果您必须自动装配,请在“is there an elegant way to inject a spring managed bean into a java custom/simple tag”
上查看我的解决方案