从非控制器类调用服务方法

时间:2014-02-17 10:13:58

标签: java spring hibernate

在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

如何解决这个问题?

3 个答案:

答案 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注释实用程序。