2013-08-01 12 views
8

che sto cercando di fare una forma che postare un CardRequestResource:Spring MVC ModelAttribute campi sono Null Invece di Forma ingresso Valori

public class CardRequestResource extends ResourceSupport{ 
    private Long cardRequestId; 
    private String deliveryMethod; 
    private String address; 
    private boolean isHomeDelivery; 
    private String requestDate; 
    private String expectedDate; 
    private String comments; 
    private Long statusId; 
    private PersonResource person; 

    //Getters and Setters 
} 

Nel mio controller, ho primo carico JSP e aggiungi un CardRequestResource vuota il ModelMap:

@RequestMapping(value = { "", "/approval" }, method = RequestMethod.GET) 
public String getApproval(ModelMap map) { 
    map.put("cardRequestResource", new CardRequestResource());  
    return "cardoffice/approval"; 
} 

mio JSP costruisce la forma con l'attributo del modello cardRequestResource:

<form:form id="detailForm" name="detailForm" modelAttribute="cardRequestResource"> 
    <form:input path="statusId" type="hidden" id="statusId" name="statusId" /> 
    <form:textarea path="comments" name="comments" id="commentTextarea" rows="7" cols="81" style="font-style: normal;"/> 
</form:form> 

funzione A Javascript effettua una chiamata AJAX per popolare i valori della forma:

function getCardRequestDetails(cardRequestUrl) { 
    $.ajax({ 
     type : "GET", 
     url : cardRequestUrl, 
     dataType : "json", 
     success : function(response) { 
      loadCardRequestDetails(response); 
     }, 
     error : function(response) {} 
    }); 
}; 

function loadCardRequestDetails(cardRequest) { 
    $("#statusId").attr("value", cardRequest.statusId); 
    $("#commentTextarea").val(cardRequest.comments); 
} 

A questo punto l'utente può aggiornare l'area di testo commento, e l'ingresso nascosto può cambiare condizionatamente su ciò che l'utente entra nel campo. Poi, quando il modulo viene inviato, che io chiamo la seguente funzione JavaScript:

function postCardRequest(url) { 
    var serialized = $("#detailForm").serialize(); 
    alert(serialized); 
    $.ajax({ 
     type: "POST", 
     url: url, 
     data: serialized, 
     contentType: "application/json", 
     dataType: "json"     
    }); 
} 

L'avviso indica che i campi sono popolati correttamente con i dati che è stato sia originariamente caricato da AJAX/Javascript, o dall'utente. Tuttavia quando arrivo al gestore nel mio controller che elabora il post, la CardRequestResource non è nullo, ma ogni singolo campo in esso è NULL!

codice del gestore:

@RequestMapping(value = "/approval/submit", method = RequestMethod.POST) 
public @ResponseBody Map<String, Object> postCardRequest(@ModelAttribute(value = "cardRequestResource") CardRequestResource cardRequestResource) { 
    Map<String, Object> responseMap = new HashMap<String, Object>(); 
    final String success = "success"; 
    Boolean isSuccessful = Boolean.FALSE; 

    if(cardRequestResource != null){ 
     isSuccessful = Boolean.TRUE; 
    } 
    //TODO 

    System.out.println("Status: " + cardRequestResource.getStatusId() + ", Comments: " + cardRequestResource.getComments()); 

    responseMap.put(success, isSuccessful); 
    return responseMap; 
} 

risposta

8

Quindi penso che ho trovato il colpevole!

Questo Lil' ragazzo proprio qui nella chiamata POST AJAX:

contentType: "application/json", 

Mi è stato originariamente mando JSON al mio controller, poi ho imparato che Spring MVC aveva quel nifty annotazione ModelAttribute, quindi non avrebbe preoccuparsi di conversione da/JSON durante il mio POST. Purtroppo, non ho pensato di togliere quella linea contentType, e si potrebbe pensare che sarebbe lanciare un errore o qualcosa con esso ancora lì ... a quanto pare non. Solo valori NULL nel binding e ore di debug infruttuoso ...

Dopo aver rimosso quella riga, ho iniziato a recuperare i dati negli attributi CardRequest anziché NULLs!

+1

Questo mi ha salvato la giornata! Grazie – jmcg

0

Provare a inserire il codice seguente in aplication-context.xml. Questa potrebbe essere la soluzione se si hanno il modulo encType='multipart/form-data'.

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
<property name="maxUploadSize" value="10000000"/> 
</bean> 
Problemi correlati