Не удалось преобразовать значение типа «java .lang.String» в требуемый тип «java .lang.Long» при отправке формы - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть это в контроллере:

@RequestMapping(
            value = "/update",
            params = {"new_profile_image"},
            method = RequestMethod.POST)
    public ModelAndView updateUserProfileImage(
            @RequestParam(value = "new_profile_image") CommonsMultipartFile newProfileImage,
            ModelMap model) {

        System.out.println("controller executed!");

        if(newProfileImage != null && !newProfileImage.isEmpty()) {
            updateService.updateUserProfileImage(newProfileImage.getBytes());
        }

        return new ModelAndView("redirect:/users/my_profile");
    }

И в файле jsp:

<form action="<c:url value='/users/update?${_csrf.parameterName}=${_csrf.token}' />" method="post"  enctype="multipart/form-data">
    <input name="new_profile_image" type="file" id="new_profile_image">

    <button type="submit" class="btn btn-primary">Update</button>
</form>

при отправке изображения я получаю

Страница ошибки Whitelabel Это приложение не имеет явного сопоставления для / error, поэтому вы видите это как запасной вариант.

Сб 08 фев. 19:08:10 CST 2020 Произошла непредвиденная ошибка (type = Bad Request , статус = 400). Не удалось преобразовать значение типа 'java .lang.String' в требуемый тип 'java .lang.Long'; вложенное исключение: java .lang.NumberFormatException: для входной строки: "update"

Строка "controller executed!" никогда не отображается в консоли. Я изменил value = "/update" на value = "/updateImage" в аннотации RequestMapping и action="<c:url value='/users/update?${_csrf.parameterName}=${_csrf.token}' />" на action="<c:url value='/users/updateImage?${_csrf.parameterName}=${_csrf.token}' />", а сообщение об ошибке изменилось на nested exception is java.lang.NumberFormatException: For input string: "updateImage"

Я понятия не имею, что не так, и в консоли затмения нет исключений

Отредактировано: я забыл сказать, что контроллер имеет RequestMapping("/users") на уровне класса.

Теперь я изменил в контроллере value = "/update" на value = "/updateImage", но я ушел action="<c:url value='/users/update?${_csrf.parameterName}=${_csrf.token}' />" на странице jsp, и ошибка по-прежнему:

Страница ошибки Whitelabel Это приложение не имеет явного сопоставления для / error, поэтому вы видите это как запасной вариант.

Sat Feb 08 19:08:10 CST 2020 Произошла непредвиденная ошибка (тип = неверный запрос, статус = 400). Не удалось преобразовать значение типа 'java .lang.String' в требуемый тип 'java .lang.Long'; вложенное исключение: java .lang.NumberFormatException: для входной строки: "update"

Я полагаю, что запрос даже не достигает контроллера.

1 Ответ

0 голосов
/ 10 февраля 2020

Я наконец решил проблему, удалив атрибут params из @RequestMapping. Итак, контроллер в итоге выглядит так:

    @RequestMapping(
            value = "/updateImage",
            method = RequestMethod.POST)
    public ModelAndView updateUserProfileImage(
            @RequestParam(value = "new_profile_image", required = true) CommonsMultipartFile newProfileImage,
            ModelMap model) {

        System.out.println("controller executed!");

        if(newProfileImage != null && !newProfileImage.isEmpty()) {
            updateService.updateUserProfileImage(newProfileImage.getBytes());
        }

        return new ModelAndView("redirect:/users/my_profile");
    }

Я использовал атрибут params с запросом post в других методах, и он работает, я думаю, что проблема здесь связана с тем, что запрос состоит из нескольких частей запрос. Но я не знаю, в чем проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...