Java Spring MVC View Render и Bind ArrayList <CustomModel>обратно в контроллер с отправкой формы - PullRequest
0 голосов
/ 19 июня 2019

У меня проблемы с отправкой моего ArrayList обратно на мой контроллер при отправке формы. Я могу получить свои значения, используя что-то вроде этого:

@RequestBody MultiValueMap<String, String> formData

Но это не то, что я хочу, и это также предоставляет мои значения CSRF, которые я не хочу оценивать в моей форме. Отправить.

У меня есть класс модели оболочки, который выглядит следующим образом:

public class CustomPayCodesWrapper {

    public ArrayList<CustomPayCodesModel> customCodes;

    public ArrayList<CustomPayCodesModel> getCustomCodes() {
        return customCodes;
    }

    public void setCustomCodes(ArrayList<CustomPayCodesModel> customCodes) {
        this.customCodes = customCodes;
    }
}

И моя модель:

public class CustomPayCodesModel {

    public String codeName;
    public String codeValue;

    public String getCodeName() {
        return codeName;
    }

    public void setCodeName(String codeName) {
        this.codeName = codeName;
    }

    public String getCodeValue() {
        return codeValue;
    }

    public void setCodeValue(String codeValue) {
        this.codeValue = codeValue;
    }
}

My .jsp:

<c:forEach var="item" items="${payCodes.customCodes}">
    <div class="row col-md-9">

         <div class="form-group row">
             <label for="payCode" class="col-md-2 col-form-label">${item.codeName}</label>
         <div class="col-md-10">
                 <input type="text" class="form-control" id="payCode" name="${item.codeName}" value="${item.codeValue}">
             </div>
         </div>

     </div>
 </c:forEach>

Я пробовал следующие привязки контроллера без какого-либо успеха:

@RequestMapping(value = "updateCustomPaymentCodes", method = RequestMethod.POST)
public ModelAndView updateCustomPayCodes(ModelAndView modelAndView, @ModelAttribute(value = "payCodes") CustomPayCodesWrapper userListWrapper, 
        ArrayList<CustomPayCodesModel> customCodes, @RequestBody MultiValueMap<String, String> formData, CustomPayCodesWrapper userListWrapper2) {


    return showCustomPaymentCodes(modelAndView);
}

1 Ответ

1 голос
/ 25 июня 2019

SpringMVC ищет определенный формат поля в html, опубликованном для анализа параметров. В случае массива он ищет поле name="customCodes[${status.index}].codeValue". Это будет преобразовано в HTML, который является name="customCodes[0].codeValue" и name="customCodes[1].codeValue" и так далее. Эти поля будут найдены и использованы для привязки к элементу List или Arrary. Я смог получить только список со следующим:

@PostMapping("/")
public ModelAndView updateCustomPayCodes(@ModelAttribute CustomPayCodesWrapper payCodes) {
    payCodes.customCodes.forEach(m->System.out.println(""+m.codeName+":"+m.codeValue));
    return buildModelAndView();
}

и

    <c:forEach items="${payCodes.customCodes}" var="customCode" varStatus="status">
        <div class="row col-md-9">        
             <div class="form-group row">
                 <label for="payCode" class="col-md-2 col-form-label">${customCode.codeName}</label>
                 <input type="hidden" name="customCodes[${status.index}].codeName" value="${customCode.codeName}"/>
             <div class="col-md-10">
                    <input type="text" class="form-control" name="customCodes[${status.index}].codeValue" value="${customCode.codeValue}"/>
                 </div>
             </div>
         </div>
     </c:forEach>

Это основано на руководстве Spring MVC: отправка формы с несколькими строками с использованием List of Beans о том же

...