2015-07-21 2 views
0

Я пытаюсь отправить данные JSON в Spring Portlet Controller. Объект Modelattribute является вложенным. Вот JSON:JSON ajax POST для Spring Portlet Controller @ResourceMapping проблема преобразования

$(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 [[email protected]] 

Мой вопрос очень похож на Post Nested Object to Spring MVC controller using JSON и Spring Portlet Jquery Ajax post to Controller

но не может использовать ResponseBody и RequestBody из-за весны портлета. Любая помощь будет оценена очень много.

Благодаря

ответ

1

У меня была эта проблема, когда я пытаюсь связать JSON массива с моей модели в Spring MVC портлета. Я не знаю, является ли проблема весной, или это способ создания моего массива JSON.

Решение, которое я нашел это:

Используйте JSON.stringify, чтобы повернуть объект (в данном случае массив) в строку с форматом JSON. Например:

formData = { 
     "name": "Demo", 
     "id": 724, 
     "periodId": 2015, 
     "orgId": 4, 
     "fieldGroupString": JSON.stringify(fieldGroupList) 
    }; 

Где fieldGroupList - массив в javascript.

Затем вы можете использовать класс ObjectMapper библиотеки jackson, чтобы превратить строку 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"); 
     } 
    } 
}