Проблема преобразования JSON ajax POST в Spring Portlet Controller @ResourceMapping
Я пытаюсь опубликовать данные JSON в методе Spring Portlet Controller. Объект Modelattribute является вложенным. Вот JSON:
$(document).on({
change: function() {
...
...
formData = {
"name": "Demo",
"id": 724,
"periodId": 2015,
"orgId": 4,
"fieldGroupList": [{
"name": "instructions",
"label": "Instructions",
"fieldList": [{
"name": "INSTRUCTION",
"instructionList": [{
"instructionText": "All enabled fields are required for completion of this screen."
}],
"type": "INSTRUCTION"
}]
}]
};
Ajax:
$.ajax({
async: "false",
global: "false",
url: validateURL,
type: "POST",
data: formData,
dataType: "json"
}).done(function(json){
console.log(json);
}).fail(function(jqXHR, textStatus, error) {
console.log("responseText: "+jqXHR.responseText);
});
контроллер:
@ResourceMapping(value = "validateURL")
public void validate(@ModelAttribute(value = "formData") Measure measure,
BindingResult bindingResult, ResourceRequest request, ResourceResponse response, ModelMap model) throws Exception {
System.out.println("ab:::"+measure.getId());
}
Модель:
public class Measure
{
private String name;
private List<MeasureFieldGroup> fieldGroupList = new ArrayList<MeasureFieldGroup>();
...
}
Также все работает нормально, если JSON изменяется на:
formData = {
"name": "Demo",
"id": 724,
"periodId": 2015,
"orgId": 4
};
Ошибка в контроллере:
org.springframework.beans.InvalidPropertyException: Invalid property 'fieldGroupList[0][fieldList][0][instructionList][0][instructionText]' of bean class abc.measures.base.Measure]: Illegal attempt to get property 'fieldGroupList' threw exception; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'fieldGroupList[0][fieldList][0][instructionList][0][instructionText]' of bean class [abc.measures.base.Measure]: Property referenced in indexed property path 'fieldGroupList[0][fieldList][0][instructionList][0][instructionText]' is neither an array nor a List nor a Set nor a Map; returned value was [abc.measures.base.MeasureFieldGroup@72fd67c]
Моя проблема очень похожа на публикацию Nested Object в Spring MVC-контроллере с использованием JSON и Spring Portlet Jquery Ajax post в Controller
но не может использовать ResponseBody и RequestBody из-за Spring Portlet. Любая помощь будет высоко ценится.
Спасибо
1 ответ
У меня возникла эта проблема, когда я пытался привязать массивы JSON к моей модели в портлете Spring MVC. Я не знаю, является ли проблема весной или в том, как я строю свой массив JSON.
Решение, которое я нашел, было следующим:
Используйте JSON.stringify, чтобы превратить объект (в данном случае массив) в строку в формате JSON. Например:
formData = {
"name": "Demo",
"id": 724,
"periodId": 2015,
"orgId": 4,
"fieldGroupString": JSON.stringify(fieldGroupList)
};
Где fieldGroupList - это массив в javascript.
Затем вы можете использовать класс ObjectMapper библиотеки Джексона, чтобы превратить строку JSON в список объектов в вашей модели.
public void setFieldGroupString(String fieldGroupString) {
if(fieldGroupString != null){
ObjectMapper mapper = new ObjectMapper();
fieldGroupList = new ArrayList<MeasureFieldGroup>();
try {
fieldGroupList = mapper.readValue(fieldGroupString,
new TypeReference<List<MeasureFieldGroup>>() {
});
} catch (Exception e) {
logger.debug("Error in mapper");
}
}
}