2014-10-03 108 views
1

我会解释一下情况。 我有一个应用程序网页,java + spring + hibernate。其实,我想DWR与Spring集成,所以我做了所有的配置,我想我所做的工作正常,因为我得到这个窗口:Java-Spring,奇怪的空指针异常

enter image description here

现在,我们可以专注于内部的findUsername(String username) methodo DWR代码:

@Autowired 
UserBo userBo; 

public boolean findUsername(String username) { 

    System.out.println("I'm in the DWR"); 

    try { 

     User user = userBo.findByUsername(username); 

     if(user != null) { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 
    catch (Exception e) { 
     System.out.println(e.toString()); 
     return false; 
    } 
} 

这是userBo.findByUsername(String username) methodo的代码:

public User findByUsername(String username) { 
    System.out.println("I'm in the BO"); 
    return userDao.findByUsername(username); 
} 

而DAO代码:

@Transactional 
public User findByUsername(String username) { 
    session = sessionFactory.openSession(); 

    System.out.println("I'm in the DAO"); 

    String hql = "FROM User Tab WHERE Tab.username= :username"; 

    Query query = session.createQuery(hql); 

    query.setParameter("username", username); 

    @SuppressWarnings("unchecked") 
    List<User> userFound = (List<User>) query.list(); 
    if (userFound.size() > 0) { 

     session.close(); 
     return userFound.get(0); 
    } 
    return null; 
} 

但是,当代码达到userBo.findByUsername(username);方法调用我得到的NullPointerException异常。

我很确定博+日工作良好,因为我已经在应用程序的其他部分使用它。

我不明白这个问题。 有人可以帮我吗?

编辑:堆栈跟踪

lcc.dwr.CCServiceDWR.findUsername(CCServiceDWR.java:26) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
java.lang.reflect.Method.invoke(Unknown Source) 
org.directwebremoting.impl.CreatorModule$1.doFilter(CreatorModule.java:229) 
org.directwebremoting.impl.CreatorModule.executeMethod(CreatorModule.java:241) 
org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:379) 
org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:332) 
org.directwebremoting.dwrp.BaseCallHandler.handle(BaseCallHandler.java:104) 
org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:120) 
org.directwebremoting.spring.DwrController.handleRequestInternal(DwrController.java:234) 
org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153) 
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:915) 
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:822) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:646) 
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:796) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040) 
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) 
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315) 
java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
java.lang.Thread.run(Unknown Source) 
+2

这条线,你可以添加堆栈跟踪? – Xstian 2014-10-03 09:53:00

+0

@Xstian因为我在DWR控制台不显示我的堆栈跟踪:S – Alist3r 2014-10-03 09:56:06

+0

username null ?? – madhairsilence 2014-10-03 09:57:53

回答

0

发现了问题:我错过的DWR-servlet.xml中

<context:component-scan base-package="lcc.*" /> 
2

如果Spring上下文完全初始化弹簧,保证了所有@Autowired字段不空豆类。

但是,如果在spring上下文完全初始化之前调用某个bean的方法,那么@autowired字段可以为null。

检查,如果你上下文之前调用findUsername(String username)准备好,如果是 - 这可能是如果你想要做一些呼叫,并确保其原因...

这方面准备尝试这样的模式:

@Component 
public class SpringContextMonitor implements ApplicationListener<ApplicationEvent> { 

    @Autowired 
    private SomeDao dao; 

    ... 

    @Override 
    public void onApplicationEvent(ApplicationEvent event) { 
     if (event instanceof ContextRefreshedEvent) { 
      onStart((ContextRefreshedEvent) event); 
     } 
    } 

    private void onStart(ContextRefreshedEvent event) { 

    // do your initialization here 
    dao.getSomething(); 
    dao2.getSomething(); 
    ... 

    } 

    ... 
} 

在那段代码中,方法onStart是在上下文变为就绪之后调用的。

+0

那么......要做什么? (我已经添加了堆栈跟踪) – Alist3r 2014-10-03 10:06:31

+0

你的堆栈跟踪显示调用'findUsername'是你的spring上下文准备好了 - 所以这不是我写的问题。另一个想法是你的bean有userBo autowired不在spring的扫描路径上,所以spring不会注入userBo。你应该打开spring日志(级别调试)并查看spring是否正在尝试注入userBo组件。 – 2014-10-03 10:13:30

+0

在调用findUsername时,userBo为空。这就是为什么我得到NullPointerException。 但在应用程序的其他部分,我已经使用@autowired UserBo没有问题 – Alist3r 2014-10-03 10:26:56