2013-08-01 23 views
8

Próbuję zrobić formularz, który będzie dodaj CardRequestResource:Wiosna MVC ModelAttribute pola są Null Zamiast Forma wartości wejściowych

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 
} 

W moim kontrolera, najpierw załadować JSP i dodać do pustej CardRequestResource ModelMap:

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

My JSP buduje formę z atrybutem modelu 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> 

funkcja javascript powoduje wywołanie AJAX do wypełnienia wartości 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); 
} 

W tym momencie użytkownik może zaktualizować pole tekstowe komentarz, a ukryte wejście może zmienić warunkowo na co użytkownik wpisze w polu. Wtedy, gdy formularz jest składany, wzywam następującą funkcję javascript:

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

Alert pokazuje, że pola są wypełnione poprawnie z danymi, które zostały albo pierwotnie załadowane przez AJAX/JavaScript lub przez użytkownika. Jednak gdy dojdę do obsługi w moim kontrolerze, który przetwarza post, CardRequestResource ma wartość inną niż null, ale w KAŻDYM POJEDYNCZYM polu jest NULL!

kod Handler:

@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; 
} 

Odpowiedz

8

Więc myślę, że znalazłem perp!

to lil”facet tu w zaproszeniu AJAX POST:

contentType: "application/json", 

ja pierwotnie wysyłanie JSON do mojego kontrolera, wtedy dowiedziałem się, że wiosna MVC miał tego ładne ModelAttribute adnotacji, więc nie miałby martwić się o konwersję do/z JSON podczas mojego testu POST. Niestety, nie myślałem, aby usunąć linię contentType, i można by pomyśleć, że spowodowałoby to błąd lub coś z tym jeszcze w nim ... najwyraźniej nie. Tylko wartości NULL w wiązaniu i godziny bezowocnego debugowania ...

Po usunięciu tej linii zacząłem pobierać dane w atrybutach CardRequest zamiast NULL!

+1

To uratowało mój dzień! Dzięki – jmcg

0

Spróbuj umieścić następujący kod w pliku application-context.xml. To może być rozwiązaniem, jeśli masz formularz encType='multipart/form-data'.

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