繁体   English   中英

当我尝试在Spring Boot和MVC中使用get映射时发生异常

[英]Exception when I try use get mapping in Spring Boot and MVC

我有一个简单的getmapping:

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

我认为我仅提供实体ID:

<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;

}

但是,当我尝试使用控制器时,会出现以下异常:

发生意外错误(类型=错误的请求,状态= 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类提供了错误类型的ID。 预期:类java.lang.Long,得到类java.lang.Integer; 嵌套异常是java.lang.IllegalArgumentException:为com.newtwitter.model.User类提供了错误类型的ID。 预期:类java.lang.Long,得到类java.lang.Integer

我可以解决吗?

本质上,您的控制器方法将User Object作为参数,但是框架具有String,并且不能将其转换为User的实例。

您的代码,因为它代表不过支持你需要使用Spring数据(你可能是),并具有启用,以使这种转换的数据春MVC扩展自动发生。

手册(4.8.2。Web支持)中对此进行了记录:

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

注意到将@EnableSpringDataWebSupport添加到您的配置中:

注册了一些基本组件:

[包含]

一个DomainClassConverter,可让Spring MVC从请求参数或路径变量解析存储库管理的域类的实例。

如果没有Spring Data Web扩展 ,则需要将方法签名更改为以下内容并手动查找实例。

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

您正在控制器中接受User对象,但从前端发送ID,因此发生此错误,因此您可以将方法更改为如下所示。

@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";
 }

更新:

否则,您应该按照以下方法使用modelattribute来更新用户,该属性将包含完整的更新对象,您只需将其直接保存到DB。

@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";
    }
@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";
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM