我有一个简单的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:提供了错误类型的ID,用于 com.newtwitter.model.User类。预期:类java.lang.Long,得到了 类java.lang.Integer
我可以解决它吗?
答案 0 :(得分:1)
本质上,您的控制器方法将User Object作为参数,但是框架具有String,并且无法将其转换为User的实例。
支持您的代码 ,但是您需要使用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";
}
答案 1 :(得分:0)
您正在控制器中接受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";
}
答案 2 :(得分:0)
@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";
}