@Autowired для @ModelAttribute - PullRequest
       7

@Autowired для @ModelAttribute

2 голосов
/ 13 февраля 2012

Я очень новичок в Spring и столкнулся со следующей проблемой.

У меня есть следующий контроллер, в котором @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";
    }
}

Но когда я отправляю свою форму, поле @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)

Ответы [ 2 ]

1 голос
/ 28 января 2016

Это будет работать, если вы используете аннотацию @Configurable на вашей модели и эту конфигурацию aspectJ в вашем файле Gradle:

compileJava << {
    ant.taskdef(
        resource: 'org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties',
        classpath: configurations.compile.asPath)

    ant.iajc(
        inpath: sourceSets.main.output.classesDir.absolutePath,
          classpath: configurations.compile.asPath,
          aspectPath: configurations.aspects.asPath,
          destDir: sourceSets.main.output.classesDir.absolutePath
    )
}

Таким образом, aspectJ будет генерировать код, который выполняет автоматическое подключение.

@Configurable
public class RegistrationForm
{
   ...
}
1 голос
/ 13 февраля 2012

Вы смешиваете свои концепции здесь.Вы используете @Component и @Autowired для bean-компонентов, управляемых Spring, и @ModelAttribute для временных, одноразовых объектов, которые используются для связывания данных формы.Два не должны быть смешаны.Spring аннулирует ваши аннотации @Component и @Autowired в RegistrationForm, поскольку они не подходят в этом контексте.

Классы, подобные RegistrationForm, должны представлять данные формы, и ничего более.Обычно контроллер запрашивает у пользователя RegistrationForm идентификатор пользователя и затем просматривает фактический объект User из самого DAO.Если вы хотите, чтобы RegistrationForm посмотрел сам User, то ваш контроллер должен вручную предоставить DAO для RegistrationForm, когда он запрашивает объект User.

Насколько это сообщение наВесенний форум обеспокоен, вы заметите, что он так и не получил ответа.Это не хороший источник вдохновения.

Обратите внимание, что я не говорю, что желание автоматически связывать бины в объект формы назад - плохая идея, я просто говорю, что Spring этого не делает.

...