2014-02-17 164 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注释实用程序。