1
@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 の値を渡しません...

この種のケースを管理するのは通常の方法ですか?

4

2 に答える 2

0

@PathVariableこの APIの を削除します。のみを使用してくださいMedicalContactDto

medicalContactIdから削除するとMedicalContactDto、この DTO を他の場所で再利用できなくなります。

@PathVariableしたがって、コントローラーに来る前に PathVariable に基づいて検証を行いたい場合を除き、から 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.

それでもパス変数を保持したい場合は、その値を使用して の を設定しmedicalContactIdますMedicalContactDto

于 2015-08-11T14:53:49.897 に答える
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つです。

于 2015-08-11T14:35:47.777 に答える