2014-10-03 6 views
1

상황을 설명하겠습니다. 응용 프로그램 웹, java + spring + hibernate가 있습니다. 사실, 나는 봄과 DWR을 통합하려는, 그래서 모든 구성을했고, 나는이 창을 얻을 수 있기 때문에 내가 좋은 일을 한 일을 생각한다, 우리는 내부의 findUsername(String username) methodo에 초점을 맞출 수 있습니다 이제Java-Spring, 이상한 NullPointerException

enter image description here

을 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이 얻을.

나는 응용 프로그램의 다른 부분에서 사용했기 때문에 좋은 일을 잘하고 있습니다.

나는이 문제를 이해하지 못한다. 누군가 나를 도울 수 있습니까?

편집 : 스프링 컨텍스트를 완전히 @Autowired 필드하지 null이 콩이라는 것을 봄 보증을 초기화하는 경우 스택 트레이스

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

+0

@Xstian 이후 DWR에 콘솔에 스택 트레이스가 표시되지 않습니다. S – Alist3r

+0

username null ?? – madhairsilence

답변

0

문제 발견 : 나는 DWR-servlet.xml에

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

.

그러나 스프링 컨텍스트가 완전히 초기화되기 전에 일부 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

그래서 ... 무슨 일을해야합니까? (stacktrace를 추가했습니다) – Alist3r

+0

stacktrace는'findUsername'에 대한 호출이 스프링 컨텍스트가 준비되었을 때임을 보여줍니다 - 그래서 이것은 제가 작성한 문제는 아닙니다.또 다른 아이디어는 userBo autowired가있는 bean이 봄의 스캔 경로에 있지 않으므로 spring이 userBo를 삽입하지 않는다는 것입니다. 스프링 로그 (레벨 디버그)를 켜고 spring이 userBo 구성 요소를 주입하려고하는지 확인해야합니다. –

+0

findUsername 호출시 userBo는 Null입니다. 그것이 NullPointerException을 얻는 이유입니다. 그러나 응용 프로그램의 다른 부분에서 나는 이미 사용자가 UserBo에 대해 @autowired를 아무 문제없이 가지고 있습니다. – Alist3r