其余架构中的重复信息

时间:2015-08-11 14:23:16

标签: spring rest spring-restcontroller

@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值传递给方法......

这是管理此类案件的正常方式吗?

2 个答案:

答案 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}}。