1. ホーム
  2. java

[解決済み] Springの@ResponseBodyアノテーションはどのように機能するのですか?

2022-03-15 21:11:54

質問

以下のようなアノテーションが付いたメソッドがあります。

/**
* Provide a list of all accounts.
*/
//  TODO 02: Complete this method.  Add annotations to respond
//  to GET /accounts and return a List<Account> to be converted.
//  Save your work and restart the server.  You should get JSON results when accessing 
//  http://localhost:8080/rest-ws/app/accounts
@RequestMapping(value="/orders", method=RequestMethod.GET)
public @ResponseBody List<Account> accountSummary() {
    return accountManager.getAllAccounts();
}

だから、このアノテーションでわかるんです。

@RequestMapping(value="/orders", method=RequestMethod.GET)

このメソッドは GET URLで表されるリソースに対して行われるHTTPリクエスト /オーダー .

このメソッドは、DAOオブジェクトを呼び出して リスト .

どこ アカウント はシステム上のユーザーを表し、このユーザーを表すいくつかのフィールドを持っている、といったところでしょうか。

public class Account {

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long entityId;

    @Column(name = "NUMBER")
    private String number;

    @Column(name = "NAME")
    private String name;

    @OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name = "ACCOUNT_ID")
    private Set<Beneficiary> beneficiaries = new HashSet<Beneficiary>();

    ...............................
    ...............................
    ...............................
}

質問です。 は、具体的にどのように @ResponseBody アノテーションはどのように機能するのですか?

の前に配置されます。 List<Account> オブジェクトを指すので、このListを指していると思われます。コースのドキュメントでは、このアノテーションは次のような機能を果たすとされています。

によってHTTPレスポンスに書き込まれることを保証します。 メッセージコンバーター(MVCビューの代わり)。

また、Springの公式ドキュメントを読むと http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/ResponseBody.html

を取るようです。 List<Account> オブジェクトを作成し、それを Http Response . これは正しいのでしょうか、それとも私が誤解しているのでしょうか?

のコメントに書かれている。 accountSummary() というメソッドがあります。

にアクセスすると、JSONの結果が得られるはずです。 http://localhost:8080/rest-ws/app/accounts

では、具体的にどういうことなのでしょうか。ということでしょうか? List<Account> オブジェクトが返す accountSummary() メソッドは、自動的に JSON の書式を設定し、それを Http Response ? それとも何?

この主張が正しい場合、オブジェクトを自動的に JSON の書式は?のときに標準的な形式が採用されますか? @ResponseBody アノテーションが使用されているのか、それとも別の場所で指定されているのか?

どのように解決するのですか?

まず、アノテーションがアノテーションしていない List . メソッドにアノテーションを付けます。 RequestMapping があります。あなたのコードは次のものと同等です。

@RequestMapping(value="/orders", method=RequestMethod.GET)
@ResponseBody
public List<Account> accountSummary() {
    return accountManager.getAllAccounts();
}

さて、このアノテーションが意味するところは、このメソッドの戻り値がHTTPレスポンスのボディを構成するということです。もちろん、HTTPレスポンスにJavaオブジェクトを含めることはできません。そこで、このアカウントのリストは、RESTアプリケーションに適した形式、通常はJSONまたはXMLに変換されます。

フォーマットの選択は、インストールされているメッセージコンバーター、および produces 属性 @RequestMapping アノテーション、およびクライアントが受け入れるコンテンツタイプ (これは HTTP リクエストヘッダで確認できます) に基づいています。例えば、リクエストにXMLは受け付けるがJSONは受け付けないと書かれていて、リストをXMLに変換できるメッセージコンバータがインストールされている場合、XMLが返されます。