Spring rest体系结构中的重复信息
在我的对象MedicalContactTo中,我有medicalContactId,所以对我来说,似乎我们复制了信息,但url允许 定义我们做什么 我没有将medicalContactId值传递给方法Spring rest体系结构中的重复信息,spring,rest,spring-restcontroller,Spring,Rest,Spring Restcontroller,在我的对象MedicalContactTo中,我有medicalContactId,所以对我来说,似乎我们复制了信息,但url允许 定义我们做什么 我没有将medicalContactId值传递给方法 这是处理此类案件的正常方法吗?我认为正确的方法是这样处理: @RequestMapping(value = "/medicalcontacts/{medicalContactId}", method =RequestMethod.PUT) public void updateMedicalCont
这是处理此类案件的正常方法吗?我认为正确的方法是这样处理:
@RequestMapping(value = "/medicalcontacts/{medicalContactId}", method =RequestMethod.PUT)
public void updateMedicalContact(@RequestBody @Valid final MedicalContactDto medicalContactDto, @PathVariable("medicalContactId") long medicalContactId){
medicalContactService.save(medicalContactDto);
}
原因是,在某些资源上使用PUT意味着您想要更改它
如果像以前一样使用它,当地址和对象中的medicalContactId不同时,可能会遇到一些问题。这将是一个很难找到的bug。我想正确的方法是这样:
@RequestMapping(value = "/medicalcontacts/{medicalContactId}", method =RequestMethod.PUT)
public void updateMedicalContact(@RequestBody @Valid final MedicalContactDto medicalContactDto, @PathVariable("medicalContactId") long medicalContactId){
medicalContactService.save(medicalContactDto);
}
原因是,在某些资源上使用PUT意味着您想要更改它
如果像以前一样使用它,当地址和对象中的medicalContactId不同时,可能会遇到一些问题。这将是一个很难找到的bug。删除此API中的
@PathVariable
。仅使用MedicalContactDto
如果从MedicalContactDto
中删除medicalContactId
,则无法在其他地方重用此DTO
因此,我的做法是从@PathVariable
中删除id,除非您在来到控制器之前想基于PathVariable进行一些验证
例:下面的例子
在拦截器中[控制在控制器之前到达拦截器]
如果仍要保留pathvariable,请使用该值将
MedicalContactDTD的medicalContactId
设置为
删除此API中的@pathvariable
。仅使用MedicalContactDto
如果从MedicalContactDto
中删除medicalContactId
,则无法在其他地方重用此DTO
因此,我的做法是从@PathVariable
中删除id,除非您在来到控制器之前想基于PathVariable进行一些验证
例:下面的例子
在拦截器中[控制在控制器之前到达拦截器]
如果仍要保留pathvariable,请使用该值设置
MedicalContactDto的medicalContactId
我将在url中使用id并忽略dto中的id。我将在url中使用id并忽略dto中的id。如果删除pathvariable,我的url将更改。。。将对post和putok进行相同的调用,请理解,在这种情况下,不要删除path变量,保留两个参数,并将此medicalContactDto.setMedicalContactId(medicalContactId)编码代码>如果删除pathvariable,我的url将更改。。。将对post和putok进行相同的调用,请理解,在这种情况下,不要删除path变量,保留两个参数,并将此medicalContactDto.setMedicalContactId(medicalContactId)编码代码>@roberttrudel-这不是它的工作方式:)。现在,你知道你在“正确地”使用它,你在使用正确的id和正确的医疗契约。不过,在将来,您可以轻松地切换一些变量。@roberttrudel-它不是这样工作的:)。现在,你知道你在“正确地”使用它,你在使用正确的id和正确的医疗契约。不过,在将来,您可以轻松地切换一些变量。
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.