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方法啊。

解决方案 »

  1.   


    按照你的方法,我的问题已经解决了!
    不过关于你所的checkUnique采用反射机制来调用,效率会很低,现在我给出我的想法,请您在多多指教!
    设计checkUnique的目的:
    在jsp页面中,设置input标签的checkUnique属性为true,表示对这个输入框中输入的值,他保存到数据库中对应的字段后,在这个字段中,他的值是不是唯一的。服务器后台的checkUnique方法就是用来实现这个功能的。
    设计checkUnique的设计思路:
    当jsp页面的input输入框失去焦点后,jsp开始向服务器提交请求,开始检查这个输入的数据是不是唯一的。
    我现在提交数据的地址是同一个地址,都是dataAction.action中的checkUnique,然后在dataManage类中反射调用每个Manage类的checkUnique方法。
    如果不用反射调用,那么,jsp页面提交数据到服务器的时候,每个jsp页面提交数据的地址是不同的,这样每个实体类所对应的action类都必须要有checkUnique。
      

  2.   


    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(...,...);