@RequestMapping(value = "/medicalcontacts/{medicalContactId}", method =RequestMethod.PUT)
public void updateMedicalContact(@RequestBody @Valid final MedicalContactDto medicalContactDto, @PathVariable("medicalContactId") long medicalContactId){
medicalContactService.save(medicalContactDto);
}
在我的对象MedicalContactDto中,我有medicalContactId,所以对我来说,它似乎是我们复制信息,但是url允许 定义我们做什么......
我没有将medicalContactId值传递给方法......
这是管理此类案件的正常方式吗?
答案 0 :(得分:0)
我认为正确的方法就是这样:
@RequestMapping(value = "/medicalcontacts/{medicalContactId}", method =RequestMethod.PUT)
public void updateMedicalContact(@RequestBody @Valid final MedicalContactDto medicalContactDto, @PathVariable("medicalContactId") long medicalContactId){
medicalContactDto.setMedicalContactId(medicalContactId);
medicalContactService.save(medicalContactDto);
}
原因是在某些资源上使用PUT意味着您想要更改它。
如果您像以前一样使用它,可能会遇到一些麻烦,当意外地在地址和对象中的medicalContactId不同时。这将是一个难以找到的错误。
答案 1 :(得分:0)
删除此API中的@PathVariable
。仅使用MedicalContactDto
。
如果您从medicalContactId
删除MedicalContactDto
,则无法在其他位置重复使用此DTO。
所以我的目的是从@PathVariable
删除id,除非你想在进入Controller之前根据PathVariable做一些验证
例如:以下情况
在拦截器 [控件来到控制器之前的拦截器]
Map pathVariables = (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
String contactId= (String) pathVariables.get("medicalContactId");
// do some validation and prevent the control from even going to controller.
如果您仍想保留路径变量,请使用该值设置medicalContactId
的{{1}}。