2

私は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";
    }
}

ただし、フォームを送信すると、RegistrationFormの@Autowiredフィールドはnullのままになります。

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フォーラムのこの投稿に触発されました)

4

2 に答える 2

1

ここで概念を混同しています。Spring 管理の Bean や、フォーム@Componentデータをバインドするために使用される一時的な使い捨てオブジェクトのようなものを使用します。2 つを混在させてはなりません。あなたと注釈 onは、そのコンテキストでは適切ではないため、Spring によって無視されます。@Autowired@ModelAttribute@Component@AutowiredRegistrationForm

のようなクラスRegistrationFormは、フォーム データを表す必要があります。通常、コントローラーはユーザー ID を要求し、DAO 自体からRegistrationForm実際のオブジェクトを調べます。それ自体を調べUserたい場合は、コントローラーがオブジェクトを要求するときに、DAO を手動で提供する必要があります。RegistrationFormUserRegistrationFormUser

Spring フォーラムのその投稿に関する限り、回答が得られていないことに気付くでしょう。インスピレーションを得るには良い情報源ではありません。

Bean をフォーム バック オブジェクトに自動配線することが悪い考えだと言っているわけではありません。Spring はそうしないと言っているだけです。

于 2012-02-12T23:48:25.420 に答える