一个简单的SPRING配置,一个简单的SERVLET,
配置好了SPRING的service等,然后给SERVLET注入一个bean,发现能注入(TOMCAT启动的时候发现能SET进去),但是调用的一直是NULL,不知道是什么原因,望高手指点.下面是相关代码。SERVLET代码public class Javaservice extends HttpServlet {
private UserService userservice;
public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException,
            IOException {
        System.out.print("f");
        userservice.getaallStudent();(这一句在运行中发现是null)
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
}
    public UserService getUserservice() {
        System.out.println("get------------------------------------");
        return userservice;
    }    public void setUserservice(UserService userservice) {
        System.out.println("set------------------------------------");(这一句在TOMCAT启动时发现正常,能注入值)
        this.userservice = userservice;
    }SPRING_APPLICATION.XML<bean id="userservice" parent="txProxyTemplate">
<property name="target"><ref bean="userserviceImpl"/></property>
<property name="proxyInterfaces">
<value>com.sos.service.UserService</value>
</property>
</bean>
<bean id="userserviceImpl" class="com.sos.service.UserServiceImpl">
<property name="userdao"><ref bean="userdao"/></property>
</bean>
<bean id="userdao" class="com.sos.hibernate.UserDAO">
<property name="sessionFactory"><ref bean="sessionFactory"/></property>
</bean>
<bean id="Javaservice" class="com.sos.action.Javaservice">
<property name="userservice"><ref bean="userservice"/></property>
</bean>
就是这个问题,不知道为什么用的时候是NULL,同样的方法在SPRINGmvc中就不是NULL

解决方案 »

  1.   

    这个问题是这样的,你在Spring的配置文件中配置的Javaservice 不是你访问页面是处理url的Javaservice。所以你看到Spring给你的Javaservice设置了userservice,但实际访问的时候却是null了。建议:把你的Servlet改写成Spring的Controller
      

  2.   

    谢谢楼上2位的回答因为现在是在做一个ACEGI的验证,没法交给SPRING容器处理才想单独写一个类去实现验证。
    这边是获取用户信息的代码<b:bean id="userDetailsService" class="com.sos.security.UserDetailsSerivceImpl"></b:bean>public class UserDetailsSerivceImpl extends BaseAction implements org.springframework.security.userdetails.UserDetailsService{
        private UserService userService;
        public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException,
                DataAccessException {
            // TODO Auto-generated method stub
            
    //        HttpServletRequest request;
    //        ServletContext   servletContext   =   request.getSession().getServletContext();
    //        ApplicationContext   ctx   =   WebApplicationContextUtils.getWebApplicationContext(servletContext);
    //        UserService userservice =(UserService) ctx.getBean("userservice");
            com.sos.hibernate.User userinfo=(com.sos.hibernate.User) userService.getStudentInfo(username);//这边需要一个SERVICE ,但是实在是不知道怎么注入.//
            if(userinfo==null){
                throw new UsernameNotFoundException(username + " 不存在");
            }
            List <GrantedAuthority> authsList=new ArrayList<GrantedAuthority>();
            for(Roles role : userinfo.getRoles()){
                authsList.add(new GrantedAuthorityImpl(role.getName()));
            }
            User userdetail = new User(userinfo.getUsername(), userinfo.getPassword(), true, 
                    true, true, true, authsList.toArray(new GrantedAuthority[authsList.size()]));
            return userdetail;
        }
    }
      

  3.   

    我看你这个acegi验证也没什么特殊的啊,还写个impl干嘛?直接用acegi的实现就可以了啊。我用过这个,不过用的就是spring的controller,如果你那个BaseAction 是struts的东西,那就应该用struts组合spring的方式,具体我想也不用细说了。实在不行还能用getBean呢。
      

  4.   

    哦,都快忘了,acegi验证如果写UserDetailsService的话,配置上就行了,不用写什么sevlet,controller,之所以配置filterProcessesUrl,是让acegi的filter去拦截这个url,而不是自己去实现。
      

  5.   

    使用spring的目的就是为了让spring为我们来提供一个已经被注入好的一个实例。而servlet是不同的,servlet是有生命周期的,而这个并不归属spring管理,而是由web容器管理的。决这个方法的思路就是,我们使用一个代理的servlet,利用这个代理的servlet去调用我们的业务servlet(其中这个业务servlet是被配置为spring中的bean),这样就可以实现其他bean注入,然后使用代理servlet调用.