java - 当我尝试在 Spring Boot 和 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
我可以修复它吗?
解决方案
本质上,您的控制器方法将用户对象作为参数,但框架有一个字符串,并且不能将其转换为用户的实例。
支持您的代码,但是您需要使用 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 Web 扩展,您需要将方法签名更改为以下内容并手动查找实例。
@GetMapping(value = "{user}")
public String edit(@PathVariable Long userId, Model model) {
User user = //user userId to fetch
model.addAttribute("user", user);
return "userEdit";
}
推荐阅读
- jenkins - Jenkinsfile 使用 s3FindFiles 在 S3 中查找文件
- php - 是否可以进行服务器重定向并同时将引用者更改为重定向域的引用者?
- jetty - JettyConnectionMetrics 算什么?
- ios - 从js调用swift函数
- python - 使用 python 并行化 MatLab 函数时,使用射线进行 cloudpickle 酸洗时出错
- dpdk - 多队列可以与 DPDK vdev rx_pcap 一起使用吗
- arrays - 根据列中的公共字符串合并两个文件,并填写不匹配的缺失值
- apache-nifi - 如何更新断开连接的 NiFi-Registry?
- html - 在 react.js(next.js) 中未应用 css 比例
- javascript - 有没有办法判断 POST(正文)请求是格式化为 URL 编码的查询字符串还是 JSON 数据?