将bean注入helper类时遇到问题。它的工作原理基本上是这样的:我在页面构造函数中创建一个对象,它可以完成一些工作,返回一些数据并在页面上显示这些数据。在此辅助对象中,应通过@Autowired
注释注入服务。但是,当我使用它时,我总是得到一个空指针异常。我也试过@SpringBean
,但没有帮助。另一方面,当我将此服务直接注入到@SpringBean
的页面时,它可以访问并且工作正常。你知道问题出在哪里吗?
这是页面:
public class Page extends BasePage {
public Page() {
HelperObject object = new HelperObject(new Application("APP_NAME"));
String result = object.getData();
add(new Label("label", result));
}
}
助手对象:
public class HelperObject {
private Application app;
@Autowired
private Service service;
public HelperObject(Application app) {
this.app = app;
}
public String getData() {
// use service, manipulate data, return a string
}
}
答案 0 :(得分:5)
您可以通过在其构造函数中调用@SpringBean
,使用InjectorHolder.getInjector().inject(this);
将依赖项注入非Spring-non-Wicket新创建的对象。
例如:
class MyPojo {
@SpringBean
MyDumbDAO dao;
MyPojo() {
InjectorHolder.getInjector().inject(this);
}
void justDoIt() {
dao.duh(); // dao is there!
}
}
请注意,只有在Wicket管理的请求中调用它才有效。如果不是(即,如果它是Quartz作业,或者在Wicket之前执行过滤器),则Application
实例将不可用,并且注入器将不知道如何获取依赖项。
另一个解决方案是使用Spring的@Configurable
。它使用AspectJ拦截带注释对象的创建,并注入其依赖项,即使您直接使用new
(或其他一些框架,如Hibernate,在内部创建它们)实例化它们。但这需要运行时或构建时(对我来说更好)字节码操作,这对某些人来说可能太神奇了。
答案 1 :(得分:3)
@SpringBean
仅将依赖项注入从Wicket的Component
继承的类中。 @Autowired
只将依赖注入Spring自己创建的类中。这意味着您无法自动将依赖项注入使用new
创建的对象。
(编辑:您还可以通过在构造函数中注入来向您的类添加@SpringBean
注入:
InjectorHolder.getInjector().inject(this);
)
我的正常解决方法是使用我的应用程序类来提供帮助。 (我对你使用new Application(...)
感到有些困惑。我认为这实际上不是org.apache.wicket.Application
。)例如:
public class MyApplication extends AuthenticatedWebApplication implements
ApplicationContextAware {
private ApplicationContext ctx;
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.ctx = applicationContext;
}
public static MyApplication get() {
return (MyApplication) WebApplication.get();
}
public static Object getSpringBean(String bean) {
return get().ctx.getBean(bean);
}
public static <T> T getSpringBean(Class<T> bean) {
return get().ctx.getBean(bean);
}
....
}
在我的Spring应用程序上下文中:
<!-- Set up wicket application -->
<bean id="wicketApplication" class="uk.co.humboldt.Project.MyApplication"/>
我的帮助对象然后按需查找服务:
public class HelperObject {
private Service getService() {
return MyApplication.getSpringBean(Service.class);
}
答案 2 :(得分:3)
最佳做法是通过工厂bean创建对象(具有Spring注入的属性,并让工厂将这些属性注入它产生的对象 - 纯IoC)。
你应该避免在整个地方使用SpringContext (或任何其他类似的解决方案)。 以下是部分原因列表: