昨天遇到一个问题:刚刚开始的时候我在Struts2里面配置Action并注入业务层类的时候是没有问题的。后来自己使用了Struts通配符问题就出来了!报的是空指针异常!搞不清楚为什么!业务层那边我自己写了个测试类是绝对没有问题的。就是Action那边出问题了!我也不知道问题出在哪里!
先来看看我的Struts2配置文件         <constant name="struts.devMode" value="true"></constant>
<!-- 设置Struts2的编码方式 -->
<constant name="struts.i18n.encoding" value="gbk" />
<package name="struts2" extends="struts-default" namespace="/zyw">
             <action name="*_*" class="com.boxun.action.{1}Action" method="{2}">
        <result>/{1}_{2}_success.jsp</result>
        <result name="input">/{1}_{2}_input.jsp</result>
        <result name="error">/{1}_{2}_input.jsp</result>
    </action>
         </package>jsp页面名跟Action名:先是Action:
LogInAction.java
StudentAction.java在是jsp:
LogIn_select_input.jsp
LogIn_select_success.jsp
Student_select_input.jsp
Student_select_success.jsp我的Actionform:
LogIn_select_input.jsp的Actionform
<s:form action="zyw/LogIn_select">Student_select_input.jsp的Actionform
<s:form action="zyw/Student_select">
Spring配置文件:         <!-- dao层注入SessFactory -->
<bean id="baseDao" class="com.boxun.dao.impl.BaseDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 业务层 -->
<bean id="empBiz" class="com.boxun.biz.impl.EmpBizImpl">
<property name="baseDao" ref="baseDao"></property>
</bean>
<bean id="stuBiz" class="com.boxun.biz.impl.StudentUserBizImpl">
<property name="baseDao">
<ref bean="baseDao" />
</property>
</bean> <!-- Action -->
<bean id="StudentAction" class="com.boxun.action.StudentAction">
<property name="studentView">
<ref bean="stuBiz"></ref>
</property>
</bean>
<bean id="LogInAction" class="com.boxun.action.LogInAction">
<property name="empView">
<ref bean="empBiz"></ref>
</property>
</bean>
Action中的Select方法代码:        //这是StudentAction
         private IStudentUserBiz studentView;
public void setStudentView(IStudentUserBiz studentView) {
this.studentView = studentView;
}
private String username;
private String userpass;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserpass() {
return userpass;
}
public void setUserpass(String userpass) {
this.userpass = userpass;
}
        public String select(){
String hql = "from Studentuser stu where stu.username=? and stu.userpass=? ";
Object[] obj = new Object[]{this.username,this.userpass};
List list = this.studentView.getAll(hql, obj);
if(null == list || list.size() <= 0){
ActionContext.getContext().put("msg", "用户名或密码错误!");
return INPUT;
}else{
ActionContext.getContext().getSession().put("user", (Studentuser)list.get(0));
ActionContext.getContext().put("msg", "登录成功!");
return SUCCESS;
}
}         //这是LogInAction
         private IEmpBiz empView;
public void setEmpView(IEmpBiz empView) {
this.empView = empView;
}


public String username;
public String userpass;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserpass() {
return userpass;    
}
public void setUserpass(String userpass) {
this.userpass = userpass;
}
public String select(){
List list = empView.getAll("from Emp mp where mp.ename=?", new Object[] {this.username});
if(null == list || list.size() <= 0){
super.addFieldError("username", "用户名或密码错误!");
return INPUT;
}
if (null!=list && list.size()>0) {
List<Emp> li = empView.getAll("from Emp", null);
ActionContext.getContext().put("list", li);  //表示存放在Request范围中
}
return SUCCESS;
}注意:业务层跟数据层是没有问题的、所以代码我不贴出来了!我想可能就是Spring依赖注入的问题。但是就是不知道他妈问题出在哪里!!!希望高手们给看看!!!

解决方案 »

  1.   

    你这里配置有很严重的问题既然action已经都交给spring来托管了那为什么你的struts配置中仍然还是用 <action name="*_*" class="com.boxun.action.{1}Action" method="{2}">
    这样的配置呢?改成这样子
       <package name="struts2" extends="struts-default" namespace="/zyw">
                 <action name="*_*" class="{1}Action" method="{2}">
                <result>/{1}_{2}_success.jsp</result>
                <result name="input">/{1}_{2}_input.jsp</result>
                <result name="error">/{1}_{2}_input.jsp</result>
            </action>
             </package>
    class应该直接指向spring中定义的bean的id。以上匹配的请求示例:
    Login_select 这个action 请求在spring中id为 LoginAction的bean中的select()方法,也就是
    com.boxun.action.LogInAction中的select()Student_select 则请求id为StudentAction的bean中的select()方法,也就是com.boxun.action.com.boxun.action.StudentAction这个action中的对应的方法注意大小写!!!!
      

  2.   

    非常感谢一楼的意见、不过我早就改过了的!无论是直接写Action类还是写Spring的beanId都不行!非常痛苦的问题!你说Spring依赖注入不行吧、但是调试的时候又能进入到dao层的访问数据库方法。但是return玩过后就开始出错了!错误是这样的:Method public java.lang.String org.hibernate.exception.NestableRuntimeException.getMessage(int) threw an exception when invoked on org.hibernate.exception.SQLGrammarException: could not execute query
    The problematic instruction:
    ----------
    ==> ${msg[0]} [on line 68, column 29 in org/apache/struts2/dispatcher/error.ftl]
    ----------Java backtrace for programmers:
    ----------
    freeer.template.TemplateModelException: Method public java.lang.String org.hibernate.exception.NestableRuntimeException.getMessage(int) threw an exception when invoked on org.hibernate.exception.SQLGrammarException: could not execute query
    at freeer.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:130)
    at freeer.ext.beans.SimpleMethodModel.get(SimpleMethodModel.java:138)
    at freeer.core.DynamicKeyName.dealWithNumericalKey(DynamicKeyName.java:111)
    at freeer.core.DynamicKeyName._getAsTemplateModel(DynamicKeyName.java:90)
    at freeer.core.Expression.getAsTemplateModel(Expression.java:89)
    at freeer.core.Expression.getStringValue(Expression.java:93)
    at freeer.core.DollarVariable.accept(DollarVariable.java:76)
    at freeer.core.Environment.visit(Environment.java:209)
    at freeer.core.MixedContent.accept(MixedContent.java:92)
    at freeer.core.Environment.visit(Environment.java:209)
    at freeer.core.IfBlock.accept(IfBlock.java:82)
    at freeer.core.Environment.visit(Environment.java:209)
    at freeer.core.IteratorBlock$Context.runLoop(IteratorBlock.java:179)
    at freeer.core.Environment.visit(Environment.java:416)
    at freeer.core.IteratorBlock.accept(IteratorBlock.java:102)
    at freeer.core.Environment.visit(Environment.java:209)
    at freeer.core.MixedContent.accept(MixedContent.java:92)
    at freeer.core.Environment.visit(Environment.java:209)
    at freeer.core.IfBlock.accept(IfBlock.java:82)
    at freeer.core.Environment.visit(Environment.java:209)
    at freeer.core.MixedContent.accept(MixedContent.java:92)
    at freeer.core.Environment.visit(Environment.java:209)
    at freeer.core.Environment.process(Environment.java:189)
    at freeer.template.Template.process(Template.java:237)
    at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:748)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:505)
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)
    Caused by: java.lang.NullPointerException
    at freeer.ext.beans.SimpleMemberModel.unwrapArguments(SimpleMemberModel.java:85)
    at freeer.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:106)
    ... 39 more
    2011-3-17 9:41:38 org.apache.catalina.core.StandardWrapperValve invoke
    严重: Servlet.service() for servlet default threw exception
    java.lang.IllegalStateException
    at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)
    at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:752)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:505)
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)
      

  3.   

    threw an exception when invoked on org.hibernate.exception.SQLGrammarException: could not execute query
    这里说明了问题...看样子果struts2和spring配置都没大问题,你先试试action的方法中不执行逻辑操作,仅仅打印语句看看能不能成功。按照上面的提示,自己仔细检查下你的映射文件配置和逻辑代码。 一步一步来排查吧...
      

  4.   

    哈哈哈~~~哥们我可以去碰豆腐了~~~昨天一不小心把表个删了!
    现在终于想起来了!不过昨天确实存在我说的问题!等我把表给恢复回来!
    在运行看看!哥们对Struts2、Spring、Hibernate整合有什么看法没有!我现在学这个框架的搭配!很多东西都不是很清楚。特别是Spring的依赖注入!
      

  5.   

    这是struts2官方http://struts.apache.org/2.2.1.1/docs/spring-plugin.html