spring - @Autowired 用于@ModelAttribute

标签 spring spring-mvc autowired modelattribute

我对 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/

相关文章:

java - spring java避免特定url的json序列化

javascript - 如何将json文件发送到spring Controller ?

java - 我可以在 Spring 中为 @Component 类创建构造函数吗

java - 使用 @Component 给出属性名称/值

java - 如何修复 UserDetails 实现的 ClassCastException?

java - 尝试使用 Autowiring 的候选者运行存储库 impl 进行测试

java - Spring Tool Suite 3.6.2 无法添加服务器适配器 Oracle Weblogic Server 10.3.5

java - 登录一个json文件

java - 如果找不到,Spring Autowired null

java - Spring数据ldap配置