在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 :(得分:1)
你应该将你的Utility
类声明/注释为spring bean,以便让其他bean被注入。在这种情况下,它是EUserService
尝试将@Component
添加到您的Utility
课程中。我假设你的软件包涉及Spring注释bean扫描设置。
答案 1 :(得分:1)
问题不在于你不是从控制器那里调用它。问题是你从不是由Spring管理的类调用它,因此userDao
不会在这里注入。
它认为“正确”的解决方案是将您的实用程序转换为Spring bean,例如将其标记为@Service
并通过Spring调用它。或者,您可以使用ApplicationContext.getBean()
以编程方式检索它(有关详细信息,请参阅here)
答案 2 :(得分:1)
只有Spring托管bean可以自动装配一个实例。阅读here
使用@Component注释实用程序。