小弟新手
框架是S1SH,现在要登陆,保存用户到session中
通过UserAction到达UserService中,调用Hibernate自动生成的UserDAO查询loginname来获取mysql中的对应的用户
结果不管怎么查都是login_fail,通过debug模式一步步的跟,发现错误是在这里:
public List findByProperty(String propertyName, Object value) {
log.debug("finding Student instance with property: " + propertyName
+ ", value: " + value);
try {
String queryString = "from Student as model where model."
+ propertyName + "= ?";
return getHibernateTemplate().find(queryString, value);
} catch (RuntimeException re) {
log.error("find by property name failed", re);
throw re;
}
}继续跟下去,到ClassLoder中
 private void checkPackageAccess(Class cls, ProtectionDomain pd) {
final SecurityManager sm = System.getSecurityManager();
         if (sm != null) {。}
进不了if,我对classloder不了解,所以不知道是不是正常情况。
继续跟下去一直是在classloder中
最后 catch (RuntimeException e) 
报错:java.lang.NullPointerException
at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:375)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
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:175)
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:263)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)

解决方案 »

  1.   

    在DAO中写main测试了下,
    StudentDAO d = new StudentDAO();
    System.out.println(d.findByLoginname("test"));报空指针,是public List findByProperty(String propertyName, Object value) {
    log.debug("finding Student instance with property: " + propertyName
    + ", value: " + value);
    try {
    String queryString = "from Student as model where model."
    + propertyName + "= ?";
    return getHibernateTemplate().find(queryString, value);
    } catch (RuntimeException re) {
    log.error("find by property name failed", re);
    throw re;
    }
    }中的return getHibernateTemplate().find(queryString, value);各位大大,帮忙看下,不胜感激
      

  2.   

    通过打印,getHibernateTemplate 为空。
    都有什么可能导致它为空呢?知道的帮忙解答下
      

  3.   

    注入不成功的问题吧 、你写一个业务层试试,将DAO注入业务层代码,再将业务层注入到Action中
      

  4.   

    我调试了。
    空指针是因为我没有注入,我new的
    现在main里面代码换了
    BeanFactory applicationContext = new ClassPathXmlApplicationContext("spring.xml");
       StudentDAO d = (StudentDAO)applicationContext.getBean("StudentDAO");    System.out.println(d.findByLoginname("test"));可以测试了测试继续报错Exception in thread "main" java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I
    at org.hibernate.hql.ast.HqlSqlWalker.generatePositionalParameter(HqlSqlWalker.java:896)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.parameter(HqlSqlBaseWalker.java:4819)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1373)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4243)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3725)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1864)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:818)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:604)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:288)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:231)
    at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:254)
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185)
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94)
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
    at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
    at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1651)
    at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:914)
    at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:1)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
    at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:912)
    at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:908)
    at com.my.dao.StudentDAO.findByProperty(StudentDAO.java:103)
    at com.my.dao.StudentDAO.findByLoginname(StudentDAO.java:111)
    at com.my.dao.StudentDAO.main(StudentDAO.java:214)
      

  5.   

    BeanFactory bf = new FileSystemXmlApplicationContext("/WebRoot/WEB-INF/config/applicationContext*.xml");//加載spring//拿到要用的dao
    ParameterDAO pd = (ParameterDAO) bf.getBean("parameterDAO");做單獨測試的時候得這樣,
    web工程加載了context後spring會自動裝載,普通的java工程就得自己手動裝載了
      

  6.   

    BeanFactory applicationContext = new ClassPathXmlApplicationContext("spring.xml");
    改成
    BeanFactory applicationContext = new ClassPathXmlApplicationContext("classpath:spring.xml");
    試試
      

  7.   

    回 6楼
    确实是这样,开始的时候我是直接new的,所以必然空指针。不过现在改了。回 7楼
    我的spring配置文件放到src目录底下了,所以可以直接拿到。后来我修改了下findByProperty方法中的查询语句,改成最简单的”from Student“  这才好。总算能查出来了,现在试着加上值看看
      

  8.   

    全查没问题,加上条件之后,就不行了
    在查询前面我加上了打印查询语句是:from Student as model where model.loginname= ?执行到return getHibernateTemplate().find(queryString, value);的时候 报错Exception in thread "main" java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I
      

  9.   

    我把以前做的项目的包全部copy过来,然后就好了
    对比了下,发现antlr-2.7.6.jar  是这个包,我刚开始用的antlr.jar  难道是版本问题???
    在此表述下也算是对自己一个提醒:整合框架,一定要注意包的冲突,还有包的版本问题。
    谢谢各位热心的朋友们。