Service层哪来的WebApplicationContext? 只有类装载器在装载MVC层时才加载WebApplicationContext。一个最简单的解决办法是:
Service层写一个类,定义一个静态的ApplicationContext属性,并将该类实现ApplicationListener监听接口,在监听到的容器事件中将ApplicationContext引用赋给类属性。最后将该类装配到Spring容器。
代码如下:@Service
public class SystemManageServiceImpl implements SystemManageService,ApplicationListener<ContextRefreshedEvent>{
private static ApplicationContext applicationContext = null; public void onApplicationEvent(ContextRefreshedEvent event){
if(this.applicationContext == null){
this.applicationContext = event.getApplicationContext();
}
} public Boolean checkUnique(){
//this.applicationContext.getBean(...);
}
}另外楼主用了内省和反射,效率低啊。既然所有Manage类都有checkUnique方法,为什么不用接口或抽象类?这样this.applicationContext.getBean(...)赋给接口或抽象类,就可以直接执行checkUnique方法啊。
Service层写一个类,定义一个静态的ApplicationContext属性,并将该类实现ApplicationListener监听接口,在监听到的容器事件中将ApplicationContext引用赋给类属性。最后将该类装配到Spring容器。
代码如下:@Service
public class SystemManageServiceImpl implements SystemManageService,ApplicationListener<ContextRefreshedEvent>{
private static ApplicationContext applicationContext = null; public void onApplicationEvent(ContextRefreshedEvent event){
if(this.applicationContext == null){
this.applicationContext = event.getApplicationContext();
}
} public Boolean checkUnique(){
//this.applicationContext.getBean(...);
}
}另外楼主用了内省和反射,效率低啊。既然所有Manage类都有checkUnique方法,为什么不用接口或抽象类?这样this.applicationContext.getBean(...)赋给接口或抽象类,就可以直接执行checkUnique方法啊。
按照你的方法,我的问题已经解决了!
不过关于你所的checkUnique采用反射机制来调用,效率会很低,现在我给出我的想法,请您在多多指教!
设计checkUnique的目的:
在jsp页面中,设置input标签的checkUnique属性为true,表示对这个输入框中输入的值,他保存到数据库中对应的字段后,在这个字段中,他的值是不是唯一的。服务器后台的checkUnique方法就是用来实现这个功能的。
设计checkUnique的设计思路:
当jsp页面的input输入框失去焦点后,jsp开始向服务器提交请求,开始检查这个输入的数据是不是唯一的。
我现在提交数据的地址是同一个地址,都是dataAction.action中的checkUnique,然后在dataManage类中反射调用每个Manage类的checkUnique方法。
如果不用反射调用,那么,jsp页面提交数据到服务器的时候,每个jsp页面提交数据的地址是不同的,这样每个实体类所对应的action类都必须要有checkUnique。
public interface CheckUnique{
public Boolean checkUnique(String name, String value);
}public class UserManageServiceImpl implements UserManageService, CheckUnique{
public Boolean checkUnique(String name, String value){
//todo
}
}public class SystemDataManageServiceImpl implements SystemDataManageService, CheckUnique{
public Boolean checkUnique(String name, String value){
//todo
}
}//调用
CheckUnique checkUnique = (CheckUnique)this.applicationContext.getBean(u2eMapping.getBeanName);//保证u2eMapping缓存里放的bean都是CheckUnique的实现类
return checkUnique.checkUnique(...,...);