Исключение, когда я пытаюсь использовать get mapping в Spring Boot и MVC - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть простое getmapping:

@GetMapping(value = "{user}")
    public String edit(@PathVariable User user, Model model) {
        model.addAttribute("user", user);
        return "userEdit";
    }

На мой взгляд, я предоставляю только идентификатор сущности:

<tr>
   <td>${user.name}</td>
   <td><a href="/user/${user.id}">Edit</a></td>
</tr>

И, наконец, в моей БД у меня есть эта сущность:

@Entity
@Table(name = "users")
public class User implements UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

}

Но когда я пытаюсь использовать свой контроллер, я получаю следующее исключение:

Произошла непредвиденная ошибка (тип = Bad Request, status = 400).Не удалось преобразовать значение типа 'java.lang.String' в требуемый тип 'com.newtwitter.model.User';вложенным исключением является org.springframework.core.convert.ConversionFailedException: не удалось преобразовать тип [java.lang.String] в тип [@ org.springframework.web.bind.annotation.PathVariable com.newtwitter.model.User] для значения.'1';вложенным исключением является org.springframework.dao.InvalidDataAccessApiUsageException: предоставлен идентификатор неправильного типа для класса com.newtwitter.model.User.Ожидаемый: класс java.lang.Long, получил класс java.lang.Integer;Вложенное исключение - java.lang.IllegalArgumentException: предоставлен идентификатор неправильного типа для класса com.newtwitter.model.User.Ожидаемый: класс java.lang.Long, получил класс java.lang.Integer

Можно ли это исправить?

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018
@GetMapping(value = "{user}")

Измените значение на строку, вы не можете передать объект в конечную точку.

public String edit(@PathVariable User user, Model model) {
        model.addAttribute("user", user);
        return "userEdit";
    }

Измените @PathVariable на @RequestBody, чтобы вы могли получить доступ к пользователю как к объекту. Или вы можете изменить, как показано ниже:

@GetMapping(value = "user/{id}")
    public String edit(@PathVariable String id, Model model) {
// you can get user information base on id here
        model.addAttribute("user", user);
        return "userEdit";
    }
0 голосов
/ 30 ноября 2018

В сущности, ваш метод контроллера принимает пользовательский объект в качестве параметра, но инфраструктура имеет строку, и ее нельзя преобразовать в экземпляр пользователя.

Ваш код в его нынешнем виде равен однако вам необходимо использовать данные Spring (которые вы, вероятно, используете) и включить расширения Spring Data MVC, чтобы преобразование происходило автоматически.

Это описано в руководстве (4.8.2. Web).поддержка):

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#core.web

, который отмечает, что добавление @EnableSpringDataWebSupport в вашу конфигурацию:

регистрирует несколько основных компонентов:

[включая]

DomainClassConverter, позволяющий Spring MVC разрешать экземпляры классов домена, управляемых репозиторием, из параметров запроса или переменных пути.

БезВеб-расширение Spring Data , вам нужно изменить сигнатуру метода на следующую и искать экземпляр вручную.

@GetMapping(value = "{user}")
    public String edit(@PathVariable Long userId, Model model) {
        User user = //user userId to fetch
        model.addAttribute("user", user);
        return "userEdit";
}
0 голосов
/ 30 ноября 2018

Вы принимаете пользовательский объект в контроллере, но отправляете идентификатор из внешнего интерфейса, поэтому возникает эта ошибка, поэтому вы можете изменить метод, как показано ниже.

@GetMapping(value = "{id}")
    public String edit(@PathVariable Long id, Model model) {
        User user = userService.read(id); //read user from the DB by id
        model.addAttribute("user", user);
        return "userEdit";
 }

ОБНОВЛЕНИЕ:

В противном случае выследуйте приведенному ниже подходу, чтобы обновить пользователя с помощью атрибута модели, который будет содержать полностью обновленный объект, вам просто нужно сохранить его в БД напрямую.

@RequestMapping(method = RequestMethod.PUT, produces = "text/html")
    public String update(User user, BindingResult bindingResult, Model uiModel,
            HttpServletRequest httpServletRequest)
    {
        //update user
        uiModel.addAttribute("user", user);
        return "updatedSuccess.jsp";
    }
...