2014-02-17 162 views
0

在HomeController中我做了以下呼叫服務方法

@Controller 
public class HomeController { 

    @Autowired 
    private EUserService userDao; 

    @RequestMapping(value = "/") 
    public String setupForm(Map<String, Object> map) { 
     User user=(User)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
     EUser currentUser = userDao.findUserByName(user.getUsername()); 
      System.out.println(currentUser.getUserName()); 
     } 
} 

它工作正常,並正確顯示我的輸出。現在,如果我做同樣的事情在非控制器類型類像下面

public class Utility { 
    @Autowired 
    private EUserService userDao; 

    public void getLoggedUser() { 
     User user = (User) SecurityContextHolder.getContext() 
       .getAuthentication().getPrincipal(); 
     EUser currentUser = (EUser) userService.findUserByName(user 
       .getUsername()); 
     System.out.println(currentUser.getUserName()); 

    } 
} 

它給了我下面的NullPointerException

SEVERE: Servlet.service() for servlet [spring] in context with path [/Ebajar] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause 
java.lang.NullPointerException 

如何解決這個問題?

+0

拋出'NullPointerException'的線是什麼? –

回答

1

問題不是你是從控制器調用這個。問題在於你從不是由Spring管理的類調用它,所以userDao不是在這裏注入的。

它認爲「正確的」解決方案是將您的工具轉換爲Spring bean,例如,標記爲@Service並通過Spring調用它。或者,您可以使用ApplicationContext.getBean()(請參閱here瞭解詳細信息)以編程方式檢索它

1

您應該將您的Utility類聲明/註釋爲spring bean,以便讓其他bean被注入。在這種情況下,它是EUserService

嘗試將@Component添加到您的Utility類。我認爲你的軟件包是由Spring註釋的bean掃描設置參與的。

+0

「我假設你的軟件包由Spring註釋的bean掃描設置參與。」這意味着什麼? – LynAs

+1

@LynAs它的意思是,你的軟件包應該包含在Spring的註釋bean掃描配置中。如果您添加「@ Component」或「@ Service」 – Kent

1

只有Spring managed bean可以自動裝入實例。閱讀here

您使用@Component註釋實用程序。