我对 Spring 非常陌生,遇到了以下问题。
我有以下 Controller ,其中 @Autowired 工作完美(尝试调试并且工作正常)。
@Controller
@RequestMapping(value = "/registration")
@SessionAttributes("rf")
public class RegistrationController
{
@Autowired
UserJpaDao userDao;
@RequestMapping(method = RequestMethod.GET)
@Transactional
public String setupForm(Model model) throws Exception
{
model.addAttribute("rf", new RegistrationForm());
return "registration";
}
@RequestMapping(method = RequestMethod.POST)
@Transactional
public String submitForm(@ModelAttribute("rf") RegistrationForm rf, Model model) throws Exception
{
// ...
User user = rf.getUser();
userDao.save(user);
// ...
return "registration";
}
}
但是当我提交表单时,RegistrationForm 中的 @Autowired 字段仍为空。
RegistrationForm.java:
@Component
public class RegistrationForm
{
@Autowired
CountryJpaDao countryDao;
// ... fields...
public RegistrationForm()
{
}
@Transactional
public User getUser() throws InvalidUserDataException
{
//...
Country c = countryDao.findByCode("GB"); // Throws java.lang.NullPointerException
// ...
}
// ... getters/setters...
}
这是表单的 HTML/JSTL:
<form:form method="POST" modelAttribute="rf">
...
</form:form>
有人可以帮助我吗?
谢谢。
(灵感来自 SpringSource 论坛上的 this post)
最佳答案
你在这里混淆了你的概念。您可以使用 @Component
等和@Autowired
对于 Spring 管理的 bean,以及 @ModelAttribute
用于绑定(bind)表单数据的 transient 、一次性对象。两者不应混合。您的@Component
和@Autowired
RegistrationForm
上的注释将被 Spring 忽略,因为它们不适合该上下文。
类似 RegistrationForm
的类应该代表表单数据,而不是其他任何东西。通常, Controller 会询问 RegistrationForm
查找用户 ID,然后查看实际的 User
来自 DAO 本身的对象。如果你想要RegistrationForm
查找 User
本身,那么您的 Controller 需要手动将 DAO 提供给 RegistrationForm
当它询问User
时对象。
就 Spring 论坛上的那个帖子而言,您会注意到它从未收到答复。这不是一个获取灵感的好来源。
请注意,我并不是说希望将 bean Autowiring 到表单返回对象中是一个坏主意,我只是说 Spring 不会这样做。
关于spring - @Autowired 用于@ModelAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9252905/