UserDTOクラスとUserControllerを公開してエンドポイントを公開し、Userを作成、更新、取得することを検討してください。
UserDTOクラスにidプロパティがあることは、作成と更新には意味がありません。 swaggerまたは他の自動生成されたAPIドキュメントを使用している場合、作成エンドポイントでIDを渡すことができることが示されます。ただし、IDは内部で生成されるため、システムはそれを使用しません。
Getを見ると、おそらくidプロパティを取り除くことができますが、リストのユーザーエンドポイントでは必ず必要です。
Get/listエンドポイントで内部ユーザードメインオブジェクトを返すことを考えていました。このようにして、UserDTOクラスからidプロパティを取り除くことができます。
これに使用できるより良いオプションはありますか?
public class UserDTO {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@RestController
@RequestMapping(value = "/users", produces = MediaType.APPLICATION_JSON_VALUE)
public class UserController {
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<Void> create(@RequestBody UserDTO user) {
}
@RequestMapping(value = "{id}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<UserDTO> get(@PathVariable("id") int id) {
}
@RequestMapping(value = "{id}", method = RequestMethod.PUT)
@ResponseBody
public ResponseEntity<Void> update(@PathVariable("id") int id, @RequestBody UserDTO user) {
}
}
この質問はされたかもしれませんが、私は見つけることができませんでした。質問が重複しているので失礼します。
[〜#〜] d [〜#〜]ata[〜#〜] t [ 〜#〜]転送[〜#〜] o [〜#〜]bject (DTO)非常に明確に定義された目的で作成されたパターンです:リモートインターフェイスにデータを転送しますWebサービスと同様です。このパターンはREST APIとDTOに非常によく適合し、長期的にはより多くの柔軟性を提供します。
RESTリソース表現が永続オブジェクトと同じ属性を持つ必要がない場合は、エンドポイントに合わせたクラスを使用することをお勧めします。
ボイラープレートコードを回避するために、 MapStruct などのマッピングフレームワークを使用して、永続オブジェクトとの間でREST API DTOをマッピングします。
REST APIでDTOを使用する利点の詳細については、以下の回答を確認してください。
DTOに適切な名前を付けるには、次の回答を確認してください。
2つの異なるインターフェースを作成するのはどうですか?
interface UserDTO {
public String getName ();
public void setName (String name);
}
interface IdentifiableUserDTO extends UserDTO {
public Long getId ();
public void setId (Long id);
}
class DefaultUserDTO implements IdentifiableUserDTO {
}
次に、DTOクラスの代わりにコントローラーのインターフェイスを使用します。
@RestController
@RequestMapping(value = "/users", produces = MediaType.APPLICATION_JSON_VALUE)
public class UserController {
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<Void> create(@RequestBody IdentifiableUserDTO user) {
}
@RequestMapping(value = "{id}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<UserDTO> get(@PathVariable("id") int id) {
}
@RequestMapping(value = "{id}", method = RequestMethod.PUT)
@ResponseBody
public ResponseEntity<Void> update(@PathVariable("id") int id, @RequestBody UserDTO user) {
}
}