Поля Spring MVC ModelAttribute имеют значение Null вместо входных значений формы
Я пытаюсь сделать форму, которая будет публиковать CardRequestResource:
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
}
в моем контроллере я сначала загружаю JSP и добавляю пустой CardRequestResource в ModelMap:
@RequestMapping(value = { "", "/approval" }, method = RequestMethod.GET)
public String getApproval(ModelMap map) {
map.put("cardRequestResource", new CardRequestResource());
return "cardoffice/approval";
}
мой JSP создает форму с атрибутом модели 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>
функция Javascript делает вызов AJAX для заполнения значений формы:
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);
}
на этом этапе пользователь может обновить текстовую область комментария, а скрытый ввод может изменить условно на то, что пользователь вводит в поле. Затем, когда форма отправлена, я вызываю следующую функцию JavaScript:
function postCardRequest(url) {
var serialized = $("#detailForm").serialize();
alert(serialized);
$.ajax({
type: "POST",
url: url,
data: serialized,
contentType: "application/json",
dataType: "json"
});
}
предупреждение показывает, что поля правильно заполнены данными, которые были первоначально загружены AJAX / Javascript или пользователем. Однако, когда я добираюсь до обработчика в моем контроллере, который обрабатывает post, CardRequestResource не равен null, но каждое поле в нем равно NULL!
обработчик код:
@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;
}
2 ответов
Итак, я думаю, что нашел преступника!
этот маленький парень прямо здесь, в сообщении AJAX call:
contentType: "application/json",
Я изначально отправлял JSON на свой контроллер, затем я узнал, что Spring MVC имеет эту замечательную аннотацию ModelAttribute, поэтому мне не придется беспокоиться о преобразовании в/из JSON во время моего сообщения. К сожалению, я не думал удалять эту строку contentType, и можно было бы подумать, что она бросит ошибку или что-то с ней все еще там... очевидно, нет. Просто Значения NULL в привязке и часы бесплодной отладки...
после того, как я удалил эту строку, я начал получать данные в атрибутах CardRequest вместо нулей!
Попробуйте поместить следующий код в контекст приложения.XML. Это может быть решение, если у вас есть форма encType='multipart/form-data'
.
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10000000"/>
</bean>