2017-07-27 6 views
0

Spring Boot 1.5.4 Je dois prendre List<OrderTo> dans la méthode POST.Comment mapper la liste <Item> dans la méthode POST RequestMapping

Controler:

 @PostMapping("/orderlist") 
     public String confirmOrder(
       , @RequestParam(name = "id", required = false) List<Integer> idL 
       , @RequestParam(name = "selected", required = false) List<Integer> selectedL 
       , @RequestParam(name = "typeName", required = false) List<String> typeNameL 
      // ...another Lists 
      // ,@ModelAttribute List<OrderTo> notWork 
     ) { 
      //  Collect All Lists 

La meilleure option que j'ai trouvé est les listes avec les champs de la classe. Peut-être qu'il me manque quelque chose.

Vue:

<form action="orderlist" method="POST" id="catalogform"> 
    <table class="table table-hover table-bordered table-striped table-condensed"> 
     <tr> 
      <th><#--...--></th> 
     </tr> 
    <#list coffeetypelist as type> <#--Freemarker--> 
     <tr> 
      <td> 
       <input type="hidden" name="id" value="${type.id}"> 
       <input type="checkbox" name="selected" value="${type.id}" > 
      </td> 
      <td><input type="hidden" name="typeName" value="${type.typeName}">${type.typeName}</td> 
      <td><input type="hidden" name="price" value="${type.price}">${type.price} TGR</td> 
      <td><input type="number" size="3" name="quantity" min="0" step="1"/></td> 
     </tr> 
     <#--...--> 
    </#list> 
<#--...--> 

Modèle:

public class OrderTo{ 
private int id; 
private String typeName; 
private int quantity; 
private Double price; 
private boolean selected; 
    //+constructors +getters + setters 

Est-ce possible de prendre la liste sans opérations de collecte supplémentaires? Comment?

+0

Vous devez classe wrapper supplémentaire contenant '' liste , et plan comme '', juste essayer –

Répondre

0

Merci shantaram_t pour la direction de la pensée. La clé est que nous avons besoin d'une classe wrapper.

public class OrderToWraper { 

    @Valid 
    @NotNull 
    private List<OrderTo> items; 

Après cela, objet OrderToWraper valide est disponible à partir du contrôleur:

@PosttMapping("/orderlist") 
public String confirmOrder(@Valid OrderToWraper orderToWraper, BindingResult result, ModelMap map) { 
    if (result.hasErrors()) { 
    //... 

Il y avait quelques instants non évidents avec la liste contraignante en utilisant freerarker (<@spring.formInput> ne fonctionne pas)

<#list orderToWraper.items as type> 
<tr> 
    <td> 
    <@macros.textInputHidden "orderToWraper.items[${type_index}].id"/> 
    <input type="checkbox" name="items[${type_index}].selected" value="true"> 
    </td> 
    <td><@macros.textInputHidden "orderToWraper.items[${type_index}].typeName"/>${type.typeName}</td> 
    <td><@macros.textInputHidden "orderToWraper.items[${type_index}].price"/>${type.price}</td> 
    <td><@macros.textInput "orderToWraper.items[${type_index}].quantity" "class='form-control'"/></td> 
    <td><@macros.showErrors "<br>" "text-danger"/></td> 
</tr> 
</#list> 

Et la macro Freemarker:

<#macro textInputHidden path> 
    <@spring.bind path/> 
    <#assign id="${spring.status.expression?replace('[','')?replace(']','')}"> 
<input type="hidden" id="${id}" name="${spring.status.expression}" value="${spring.stringStatusValue}"> 
    <#nested> 
</#macro>