Не удается привязать данные к свойствам списка ModelAttribute весной mvc - PullRequest
0 голосов
/ 01 августа 2020

Я использую spring mvc и ajax для запроса данных с сервера

Это мой класс ModelAttribute

@Data
public class PromotionSettingCriteria extends BaseRequest{

    private Long[] promotionIds;

    private Long promotionId;

}

Это мой ajax запрос

$.ajax({
                url: path + '/promotion/setting/search.htm',
                type: 'POST',
                data: {
                    promotionIds: promotionIds,
                    promotionId: promotionIds[0],
                },
                success: function (response) {
                    let settingResponse = JSON.parse(response);
                    console.log('Promotion setting', response);
                    if (settingResponse.status == '1') {
                        // console.log(response)
                    }
                },
                error: function () {
                    console.log("Promotion setting error");
                }
            })

Класс контроллера

@Controller
@RequestMapping("/promotion")
public class PromotionController extends BaseController {
@RequestMapping(value = "/setting/search", method = RequestMethod.POST)
    @ResponseBody
    public Object searchPromotionSetting(HttpServletRequest request,@ModelAttribute PromotionSettingCriteria criteria) {

        try{

            Map<String, Object> requestParams = getRequestParams(request);

            if (criteria != null && criteria.getPromotionIds() == null){
                throw new ServiceException("Promotion Setting Criteria Cannot be NULL");
            }

            List<PromotionSetting> resultData = promotionSettingService.getPromotionSettingByCriteria(criteria);

            return RequestUtil.createSuccessResponse(resultData);

        }catch (Exception e){
            return RequestUtil.createFailResponse(e);
        }

    }
}

Это часть запроса от браузера введите описание изображения здесь

когда я не передаю идентификаторы промоушена, контроллер работает нормально и привязывает свойство промоушена, но когда я передаю идентификаторы промоушена, он показывает java.lang.NumberFormatException: For input string: ""

[analyze][DEBUG] [2020-07-31 17:35:18] org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(134) | Resolving exception from handler [com.analyze.controller.PromotionController@1af465c7]: java.lang.NumberFormatException: For input string: ""
[analyze][DEBUG] [2020-07-31 17:35:18] org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(134) | Resolving exception from handler [com.analyze.controller.PromotionController@1af465c7]: java.lang.NumberFormatException: For input string: ""
[analyze][DEBUG] [2020-07-31 17:35:18] org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(134) | Resolving exception from handler [com.analyze.controller.PromotionController@1af465c7]: java.lang.NumberFormatException: For input string: ""
[analyze][DEBUG] [2020-07-31 17:35:18] org.springframework.web.servlet.FrameworkServlet.processRequest(989) | Could not complete request
java.lang.NumberFormatException: For input string: ""

Как разрешить привязку контроллера свойство списка в классе ModelAttribute?

1 Ответ

0 голосов
/ 07 августа 2020

Обновите свой ajax запрос

$.ajax({
    url: path + '/promotion/setting/search.htm',
    type: 'POST',
    contentType: "application/json",
    data: JSON.stringify({
        promotionIds: promotionIds,
        promotionId: promotionIds[0],
    }),
    dataType: "json",
    success: function (response) {
        let settingResponse = JSON.parse(response);
        console.log('Promotion setting', response);
        if (settingResponse.status == '1') {
            // console.log(response)
        }
    },
    error: function () {
        console.log("Promotion setting error");
    }
})

Кроме того, вам необходимо обновить метод контроллера, заменив @ModelAttribute на @RequestBody

@RequestMapping(value = "/setting/search", method = RequestMethod.POST)
@ResponseBody
public Object searchPromotionSetting(HttpServletRequest request, @RequestBody PromotionSettingCriteria criteria) {
    // your code here
}
  • content-type: "application/json" указывает, что вы собираетесь отправить json
  • dataType: "json" вы ожидаете json в качестве ответа
  • data : JSON.stringify({...}) преобразование вашего js объекта в строку
...