搭建一个ssh框架,struts2。好像是spring注入的问题。
架构层次就是action—>service—>dao—>model.我怀疑是spring注入问题。但是在测试类中,却得到了正确的结果。spring的注入我用的是标注\注释
java类:
[code=Java]
action层:
package spier001.action;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;import org.apache.struts2.interceptor.ServletRequestAware;
import org.springframework.stereotype.Component;import spier001.service.AdminService;import com.opensymphony.xwork2.ActionSupport;@Component
public class LoginAction extends ActionSupport implements ServletRequestAware{
private AdminService adminService;
private HttpSession session;
private String username;
private String password;

@Override
public String execute(){

if(username!=null && !username.equals("")
&& password!=null && !password.equals("")){
session.setAttribute("username", username);
session.setAttribute("password", password);
System.out.println(username);
System.out.println(password);
if(adminService==null)
System.out.println("注入失败!");
if( adminService.exist(username,password))//异常!!!!!!!!!
return SUCCESS;
}


return ERROR;
}
public void setServletRequest(HttpServletRequest arg0) {
session = arg0.getSession();

}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public AdminService getAdminService() {
return adminService;
}
@Resource
public void setAdminService(AdminService adminService) {
this.adminService = adminService;
}}service层:
package spier001.service;import java.util.List;
public interface Service {
public void add(Object persistentInstance);
public void delete(Object persistentInstance);
public void update(Object persistentInstance);
public List query(int pageNum); //无条件的查询
public List query(int pageNum,Object persistentInstance);  //将所有条件都封装在o中,没有输入的属性为空。
}package spier001.service;
import java.util.List;import javax.annotation.Resource;import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;import spier001.dao.AdmininfoDAO;
import spier001.model.Admininfo;
@Transactional
@Component
public class AdminService implements Service { private AdmininfoDAO admininfoDAO; public AdmininfoDAO getAdmininfoDAO() {
return admininfoDAO;
}
@Resource
public void setAdmininfoDAO(AdmininfoDAO admininfoDAO) {
this.admininfoDAO = admininfoDAO;
} public void add(Object persistentInstance) {
// TODO Auto-generated method stub
admininfoDAO.save((Admininfo) persistentInstance);
} public void delete(Object persistentInstance) {
// TODO Auto-generated method stub
admininfoDAO.delete((Admininfo) persistentInstance);
} public List query(int pageNum) {
// TODO Auto-generated method stub
return null;
} public List query(int pageNum, Object persistentInstance) {
// TODO Auto-generated method stub
return null;
} public void update(Object persistentInstance) {
// TODO Auto-generated method stub } public boolean exist(String username,String password) {
List l = admininfoDAO.findByName(username);
if(l==null||l.isEmpty()){
System.out.println("没有这个名称 用户");
return false;
}

return true;
}}

解决方案 »

  1.   


    dao层:
    package spier001.dao;import java.util.List;import javax.annotation.Resource;
    import org.hibernate.criterion.DetachedCriteria;import org.springframework.context.ApplicationContext;
    import org.springframework.orm.hibernate3.HibernateTemplate;
    import org.springframework.stereotype.Component;
    import spier001.model.Admininfo;@Component
    public class AdmininfoDAO  {
    private HibernateTemplate hibernateTemplate;

    public void save(Admininfo transientInstance) {
    hibernateTemplate.save(transientInstance);

    } public void delete(Admininfo persistentInstance) {
    hibernateTemplate.delete(persistentInstance);

    } public void update(Admininfo persistentInstance){
    hibernateTemplate.update(persistentInstance);
    }

    public List query(DetachedCriteria criteria,int firstResult,int maxResult){
    List result = hibernateTemplate.findByCriteria(criteria, firstResult, maxResult);
    return result;
    }
    public Admininfo findById(java.lang.String id) {

    Admininfo instance = (Admininfo) getHibernateTemplate().get(
    "spier001.model.Admininfo", id);
    return instance;
    } public List findByProperty(String propertyName, Object value) {

    String queryString = "from Admininfo as model where model."
    + propertyName + "= ?";
    return getHibernateTemplate().find(queryString, value);

    } public List findByName(Object username) {
    return findByProperty("aname", username);
    } public List findAll() {

    String queryString = "from Admininfo";
    return hibernateTemplate.find(queryString);
    }
    public static AdmininfoDAO getFromApplicationContext(ApplicationContext ctx) {
    return (AdmininfoDAO) ctx.getBean("admininfoDAO");
    }

    @Resource
    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
    this.hibernateTemplate = hibernateTemplate;
    } public HibernateTemplate getHibernateTemplate() {
    return hibernateTemplate;
    }
    }
    model层:
    package spier001.model;import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import static javax.persistence.GenerationType.IDENTITY;
    import javax.persistence.Id;
    import javax.persistence.Table;/**
     * Admininfo entity. @author MyEclipse Persistence Tools
     */
    @Entity
    @Table(name = "admininfo", catalog = "posdb")
    public class Admininfo implements java.io.Serializable { // Fields private String aid;
    private String aname;
    private String apwd;
    private String alevel; // Constructors /** default constructor */
    public Admininfo() {
    } /** minimal constructor */
    public Admininfo(String aname, String apwd) {
    this.aname = aname;
    this.apwd = apwd;
    } /** full constructor */
    public Admininfo(String aname, String apwd, String alevel) {
    this.aname = aname;
    this.apwd = apwd;
    this.alevel = alevel;
    } // Property accessors
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "Aid", unique = true, nullable = false, length = 20)
    public String getAid() {
    return this.aid;
    } public void setAid(String aid) {
    this.aid = aid;
    } @Column(name = "Aname", nullable = false, length = 50)
    public String getAname() {
    return this.aname;
    } public void setAname(String aname) {
    this.aname = aname;
    } @Column(name = "Apwd", nullable = false, length = 20)
    public String getApwd() {
    return this.apwd;
    } public void setApwd(String apwd) {
    this.apwd = apwd;
    } @Column(name = "Alevel", length = 20)
    public String getAlevel() {
    return this.alevel;
    } public void setAlevel(String alevel) {
    this.alevel = alevel;
    }}
    测试类:
    package spier001.test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;import spier001.model.Admininfo;
    import spier001.service.AdminService;
    public class springTest {
    public static void main(String[] args){
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    AdminService as = (AdminService)ac.getBean("adminService");

    //Admininfo admin = new Admininfo("zrks","123456");
    System.out.println("AdminService测试...\n\n");
    System.out.println(as.getAdmininfoDAO().findById("10001").getAname());

    }
    }[/code]
    hibernate配置文件:
    <?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools.                   -->
    <hibernate-configuration> <session-factory>
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="connection.url">jdbc:mysql://127.0.0.1:3306/posdb</property>
    <property name="connection.username">root</property>
    <property name="connection.password">123</property>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="myeclipse.connection.profile">pos</property>
    <property name="format_sql" >true</property> </session-factory></hibernate-configuration>
    spring配置文件:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/context
                 http://www.springframework.org/schema/context/spring-context-2.5.xsd
                 http://www.springframework.org/schema/aop 
                http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
                http://www.springframework.org/schema/tx 
                http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
               
        
        <context:annotation-config/>
    <context:component-scan base-package="spier001"></context:component-scan>
    <tx:annotation-driven transaction-manager="transactionManager"
    proxy-target-class="true" />


    <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="configLocation"
    value="classpath:hibernate.cfg.xml">
    </property>
    <property name="packagesToScan" value="spier001"></property>
    </bean>

    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

    <bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
    <ref local="sessionFactory" />
    </property>
    </bean>
               
    </beans>
    web.xml:<?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <welcome-file-list>
    <welcome-file>/login.jsp</welcome-file>
    </welcome-file-list> <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 初始化Spring容器-->
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
    </context-param> <filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter>
    <filter-name>struts2</filter-name>
    <filter-class>
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    </web-app>
      

  2.   

    基本上没什么太大的问题了!看下spring的配置文件、我Q260575364 我可以帮你!
      

  3.   

    问题很明显了!你的adminService都没用托管到spring当中、不报错才怪!
      

  4.   

    同意,bean 没有注入,所有的dao 和 service 都需要注入才能用
      

  5.   

    可是在adminService之前有加@Component呀
      

  6.   

    你只托管了dao层~~~Service都没有托管!
       Service层托管一次!!!:<bean id="admininfoService" class="你业务层实现类地址">
    <property name="admininfoDAO" ref="hibernateTemplate"></property>
    </bean> 然后action在托管一次!:
       
    <bean id="admininfoAction" class="你Action类地址">
    <property name="adminService" ref="admininfoService"></property>
    </bean>大概就这个样子!你先试试!
      

  7.   

    试过,不行。另外你怎么而看到service没托管,dao托管了。那条语句是你说的dao托管了
      

  8.   


    少<bean id="AdmininfoDAO" class="spier001.model.Admininfo.AdmininfoDAO">
    <property name="sessionFactory">
    <ref local="sessionFactory" />
    </property>
    </bean>
      

  9.   

    就是adminService没有注入进去,所以才是空指针异常了。
    @component("name")写好了么
    还有setAdminService上些@resource了没不过struts可以自动注入到spring中还有struts.xml中的class是否和action中的名字一致。
      

  10.   

    Service层没有交给Spring管理,无法注入
      

  11.   

    Action中的setter方法呢?
    估计Action中没有注入哦!!在看看struts2.xml中有没有struts.ObjectFactory=spring还有一句好=type的那句话,在看看有没有struts2和spring整合的那个jar包有没有!!