Проблема преобразования 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");
        }
    }
}
Другие вопросы по тегам