Динамическое выпадающее меню, загруженное с помощью ajax, в весеннем контроллере mvc обнаружено как нуль

Я динамически загружал раскрывающийся список с вызовом ajax, но проблема в том, что я не могу получить к нему доступ в controller. динамически загружаемый раскрывающийся список находится как null в контроллере!

Код JSP:

<body>
    <c:url var="updateUrl" value="${actionPath}"/>
    <form:form method="post" action="${updateUrl}" commandName="complaintDetail">
        <table>
            <tr>
                <td><form:label path="complaintCategory">Category</form:label></td>
                <td>                        
                    <form:select path="complaintCategory">
                        <form:option value="NONE" label="--- Select ---" />
                        <form:options items="${categoryList}"/>
                    </form:select>
                </td> 
            </tr>
            <tr>
                <td><form:label path="complaintReasonDetail">Reason</form:label></td>
                <td>                        
                    <form:select path="complaintReasonDetail">
                        <form:option value="NONE" label="--- Select ---" />
                        <form:options items="${reasonList}" />
                    </form:select>
                </td> 
            </tr>
            <tr>
                <td colspan="2">
                    <input type="submit" value="${submitString}">
                </td>
            </tr>
        </table>  
    </form:form>
</body>

JS-код:

$('#complaintCategory').change(
function(){
    var findReasonsURL = '/Vela-web-client/complaint/getReason/' + $(this).val() + '/GENERAL.htm';
    //alert($(this).val());
    $.getJSON(findReasonsURL, {},
    function(data) {
        var html = '<option value="">--- Select ---</option>';
        var len = data.length;
        $.each(data, function(i, obj){
            html += '<option value="' + obj.idNr + '">' + obj.complaintReasonSt + '</option>';
        });

        $('#complaintReasonDetail').html(html);

    });
}); 

Для этого вызова ajax соответствующий код контроллера:

@RequestMapping(value = "/complaint/getReason/{category}/{rType}", method = RequestMethod.GET)
public @ResponseBody 
List<ComplaintReasonDetail> getReason(
        @PathVariable(value = "category") String category,
        @PathVariable(value = "rType") String rType)
{
    List<ComplaintReasonDetail> complaintReasonDetails;

    ComplaintCategory complaintCategory = ComplaintCategory.valueOf(category);
    ReasonType reasonType = ReasonType.valueOf(rType);
    try
    {
        complaintReasonDetails = ComplaintReasonHandler.getComplaintReasonAdvanceSearchResult("", false, complaintCategory, true, reasonType, true, BigInteger.ONE);
        System.out.println("reason list count = " + complaintReasonDetails.size());
        return complaintReasonDetails;
    }
}

До этого все работает нормально!

Проблема возникает, когда я отправляю форму. Я получаю complaintReasonDetail как null в коде контроллера.

Код контроллера:

@RequestMapping(value = "/complaint/doadd/addnew", method = RequestMethod.POST)
public String addCompliant(@RequestBody @ModelAttribute("complaintDetail") ComplaintDetail complaintDetail, BindingResult result, Model model)
{
    System.out.println("category = "+complaintDetail.getComplaintCategory()); // OK
    System.out.println("reason = "+complaintDetail.getComplaintReasonDetail());  // print null ???
}

Это немного длинный вопрос, но, чтобы прояснить, я думаю, что это необходимо.

Итак, что я упускаю на самом деле?


person sarwar026    schedule 17.09.2014    source источник
comment
проверьте источник просмотра браузера, какой html сгенерирован для поля выбора жалобыReasonDetail? а также значение первой опции пусто, не задано в jquery.   -  person Abhishek Nayak    schedule 17.09.2014
comment
@Rembo: да, он генерируется, и я вижу его в разделе form-data, когда форма отправляется и передается значение (например, 2). Но я думаю, что это значение не отображается на complaintReasonDetail или как преобразовать его в этот объект.   -  person sarwar026    schedule 17.09.2014
comment
является типом примитива/оболочки complaintReasonDetail? или определяемый пользователем, если он определяется пользователем, вам нужен конвертер. посмотрите на этот ответ и документы   -  person Abhishek Nayak    schedule 17.09.2014
comment
Да, это определяется пользователем и является настраиваемым классом. Нет ли способа избежать конвертера, так как я уже извлекаю его из базы данных при динамической загрузке раскрывающегося списка? Спасибо за ссылку.   -  person sarwar026    schedule 17.09.2014
comment
есть, вы можете создать еще одну дополнительную переменную для хранения выбранного значения и изменить путь поля выбора на тот же. затем вы можете получить complaintReasonDetail, используя его.   -  person Abhishek Nayak    schedule 17.09.2014
comment
@Rembo: Спасибо за помощь. Но я был бы признателен за изменение пути, чтобы я мог получить жалобуReasonDetail. Вы также можете поместить все это в качестве ответа, чтобы я мог его принять. Спасибо   -  person sarwar026    schedule 17.09.2014


Ответы (1)


Вы можете вызвать ajax из select с событием onchange, как показано ниже:

function onChangeAjaxMain()
        {
            var name = $('#state').val();

            $.ajax({
                type: "POST",
                url : 'mainAjax',
                data: ({
                    nameOfCategory: name
                }),
                success : function(data) {
                    $('#city').html(data);

                }
            });
        }

в jsp используйте форму: формат весны:

<form:select name="state" id="state" onclick="onChangeAjaxMain()" path="state">
    <form:option value="1">blah</form:option>
    <form:option value="2">blah</form:option>
</form:select>
    <br>
    <form:select id="city" path="city">
        <form:option value="NONE">City</form:option>
    </form:select>

наконец, в контроллере:

@RequestMapping(value = "/mainAjax", method = RequestMethod.POST)
    public @ResponseBody
   String mainAjax(@RequestParam("state") String state){

        String cities= "<option value=\"\">City</option>";
        ArrayList<City> citySet = /*fill list respect to state*/

        for(City city : citySet){

            cities+= "<option value=\""+city.getName+"\">"+city.getName+"</option>";
        }
        cities+= "</option>";
        return cities;

В maven добавьте: jackson-core и jackson-databind. Я использую версию 2.6.3, а также добавляю jackson-mapper-asl с версией 1.5.3.

Я надеюсь, что это будет полезно для вас!

person Shakhboz    schedule 21.04.2017