Как вернуть несколько @ModelAttribute в аннотированных весной контроллерах? - PullRequest
1 голос
/ 09 июля 2010

Я нахожусь в процессе преобразования моих контроллеров в контроллеры аннотированного стиля весной mvc.

В основном я делаю это в старом стиле контроллера simpleformcontroller.

protected Map referenceData(HttpServletRequest request) throws Exception
{
    Map referenceData = new HashMap();

    List<ItemVo> lstItem1 = eqrManager
        .searchAllEqptCondQualItems("A1", "BOXES");
    List<ItemVo> lstItem2 = eqrManager
        .searchAllEqptFullQualItems("A2", "CANNED_GOODS");
    referenceData.put("BOX_ITEMS", lstItem1);
    referenceData.put("CANNED_ITEMS", lstItem2);
    return referenceData;
}

В аннотации я делаю что-то вроде этого:

@ModelAttribute("BOX_ITEMS")
public List<ItemVo> populateCondEQRItems() {
    List<ItemVo> lstCondQual = eqrManager
            .searchAllEqptCondQualItems("A1", "BOXES");
    return lstCondQual;
}

@ModelAttribute("CANNED_ITEMS")
public List<ItemVo> populateFullEQRItems() {
    List<ItemVo> lstFullQual = eqrManager
            .searchAllEqptFullQualItems("A2", "CANNED_GOODS");
    return lstFullQual;
}

У меня вопрос, есть ли способ вернуть все атрибуты только одним методом, а не необходимость создать несколько @ModelAttribute? В моем случае мне нужно аннотировать 2 метода? Что если мне нужно 3, я должен также создать 3 аннотированных метода?

Ответы [ 2 ]

6 голосов
/ 09 июля 2010

Правило ясно

Если вам требуется более одного атрибута модели, принимает модель в качестве входного аргумента

@RequestMapping(method=RequestMethod.GET)
public void setUp(Model model) {
    model.addAttribute("CANNED_ITEMS", eqrManager.searchAllEqptFullQualItems("A2", "CANNED_GOODS"))
         .addAttribute("BOX_ITEMS", eqrManager.searchAllEqptCondQualItems("A1", "BOXES"));
}

Удачи!

1 голос
/ 09 июля 2010

Я не могу понять это ясно

Ok! Я говорил, что @ModelAttribute может быть размещен как на уровне метода, так и на уровне параметра метода. И он ведет себя по-разному, зависит от того, где вы его положили.

    @ModelAttribute(user)
public void preRender(Model model) {
        /* this method will be invoked before resolving @ModelAttribute Method Parameter i.e. before invoking render/processCreate method */
       /* codes are available to CreateUser.jsp if render request comes */
       /* codes are available to CreateUser.jsp if validation fails */
        model.addAttribute("countryCodes", I18Nservice.getCountryISOCodes());
        model.addAttribute("languageCodes", I18Nservice.getLanguageISOCodes());
}

public String renderCreate(@ModelAttribute(value="user") User user) {
    return "/user/create";
}

@Override
public String processCreate(@ModelAttribute(value="user") User user, BindingResult result) {
           if(result.hasErrors() {
             return "/user/create";
           }
            securityService.createUser(user);
            return "/user/detail/user.getId()";
}

Если вы новичок в Spring MVC 3 arena:

  1. read Web MVC framework
  2. Проверка @ RequestMapping JavaDoc
  3. И играть с Petcinic & mvc-витрина
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...