【发布时间】:2018-10-09 20:00:22
【问题描述】:
我无法以正确的方式成功更新用户数据,例如他的名字或姓氏
控制器:
@Controller
public class UpdateUserData {
@Autowired
private UserService userService;
@RequestMapping(value = "/user/updateFirstName", method = RequestMethod.POST)
public String changeUserFirstName(RedirectAttributes rm, final Locale locale, @Valid UserDto userDto) {
final User user = (User) SecurityContextHolder.getContext()
.getAuthentication()
.getPrincipal();
userService.changeUserFirstName(user, userDto.getFirstName());
rm.addFlashAttribute(
"message",
messages.getMessage("message.updateFirstNameSuc", null, locale)
);
return "redirect:/user/myAccount?lang=" + locale.getLanguage();
}
}
这就是 myAccount html 页面中相关的部分:
<div class="manageinfo">
<h1>Manage your personal information</h1>
<br/>
<div class="container">
<div th:if="${message != null}" class="alert alert-info"
th:text="${message}">message</div>
<div th:each = "user: ${user}" >
<p>Firstname</p>
<input type="text" th:value="${user.firstName}"><a data-toggle="modal"
data-target="#myModalFirstName"><i class="fa fa-pencil fa-lg"> </i></a>
</div>
<!-- Modal for firstName-->
<div class="modal fade" id="myModalFirstName" role="dialog">
<button type="button" class="close" data-dismiss="modal">×</button>
<form th:action="@{/user/updateFirstName}" th:method="POST">
<p>First Name</p>
<input type="text" name="firstName" required="required">
<span id="firstNameError" style="color:#F41F0E" ></span>
<button type="submit" class="btn btn-default" >Save</button>
</form>
</div>
</div>
</div>
UserServiceImpl:
public void changeUserFirstName(final User user, final String firstname) {
user.setFirstName(firstname);
userRepository.save(user);
}
当我尝试更改名称时,我会收到
Failed to resolve argument 2 of type Myproject.dto.UserDto
javax.validation.ValidationException: HV000028: Unexpected exception during isValid call
【问题讨论】:
-
您在将请求数据转换为UserDTO时可能会遇到问题,检查类型是否正确(如日期或数字),方法
changeUserFirstName似乎没问题 -
谢谢@OlivierBoissé。我使用 UserDto 进行更新,与 UserDto 进行注册相同。但是,当我尝试更新诸如名字之类的字段时,它给了我一个验证错误和空指针,因为其他字段不能为空输入。我的解决方法是单独为名字创建一个 UpdateDto,单独为姓氏创建一个 UpdateDto,并进行特定验证,以解决此问题。顺便说一句,我觉得拥有多个 Dto 不是正确的技术?使用多个Dto是否正确?有没有办法只传递和更改 Dto 模型中的一个值?
-
为不同的场景拥有多个 DTO 非常好。但是很奇怪,您有一个用于更新名字的端点和另一个用于更新姓氏的端点,为什么没有一个用于更新用户的唯一端点?
-
@OlivierBoissé 因为我希望用户能够单独更新他的名字或姓氏,而我不能在一个 Dto 中这样做。因为如果用户尝试使用包含 fname 和 lname 的 Dto 更新 fname,则会引发验证和空指针错误。
-
那么为什么只为一个字段创建 DTO...您可以使用
@RequestBody String firstName而不是@Valid UserDto userDto
标签: java spring-boot spring-data spring-data-jpa thymeleaf