web-dev-qa-db-ja.com

残りのエンドポイントを作成、更新、および取得する際の同じ/異なるDTOオブジェクト?

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) {
    }
}

この質問はされたかもしれませんが、私は見つけることができませんでした。質問が重複しているので失礼します。

14

[〜#〜] d [〜#〜]ata[〜#〜] t [ 〜#〜]転送[〜#〜] o [〜#〜]bject (DTO)非常に明確に定義された目的で作成されたパターンです:リモートインターフェイスにデータを転送しますWebサービスと同様です。このパターンはREST APIとDTOに非常によく適合し、長期的にはより多くの柔軟性を提供します。

RESTリソース表現が永続オブジェクトと同じ属性を持つ必要がない場合は、エンドポイントに合わせたクラスを使用することをお勧めします。

ボイラープレートコードを回避するために、 MapStruct などのマッピングフレームワークを使用して、永続オブジェクトとの間でREST API DTOをマッピングします。

REST APIでDTOを使用する利点の詳細については、以下の回答を確認してください。

DTOに適切な名前を付けるには、次の回答を確認してください。

8
cassiomolin

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) {
    }
}
1
Wael Sakhri