これは、ページパラメーターを含むコンテキストがありません。リンクも表示されます。次のコマンド(出力とともに表示)はこれを行います。使用する場合、コマンドラインはそれが改行であると見なします。この問題を回避するには、URL全体を引用符で囲みます。それはきれいに見えますが、それを利用するためにフロントエンドを更新するとさらに良くなります。RESTがすぐに提供するハイパーメディアコントロールの使用を開始するために、バックエンドでこれ以上の変更は必要ありません。フロントエンドでの作業に切り替えることができます。REST固有」であることを指摘することが重要です。その他の標準を使用します。それが、rest.jsの使用が簡単な理由です。そのライブラリにはHALがサポートされています。/api/employeesにハードコードしました。使用して、次のようにルートから開始して目的の場所に移動できます。componentDidMount()内で直接行われました。このセクションでは、ページサイズが更新されたときに従業員のリスト全体を再読み込みできるようにします。loadFromServer()に物を移動しました。前のセクションと非常によく似ています。follow()を使用します。2番目の引数は、開始するルートURIです。3番目の引数は、ナビゲートする関係の配列です。各文字列またはオブジェクトを指定できます。["employees"]のように単純にすることができます。見つけてナビゲートします。配列に別の関係がある場合は、プロセスを繰り返します。不十分な場合があります。このコードの断片では、?size=<pageSize>のクエリパラメーターもプラグインします。後で見るように、提供できる他のオプションがあります。/>内に表示しました。取得するために別の呼び出しを実行しています。コマンドを実行することにより、自分でデータを表示できます(出力とともに表示)。この場合、コンテンツネゴシエーションを使用してJSONスキーマを取得しています。/>`コンポーネントの状態でこの情報をキャプチャーすることにより、後で入力フォームを作成するときにこの情報を活用できます。新しいレコードを作成するこのメタデータを装備して、UIにいくつかの追加コントロールを追加できるようになりました。/>を作成することから開始できます。機能の両方があります。要素の配列に変換します。Reactが複数の子ノードを区別するために再び必要です。これは、単純なテキストベースの入力フィールドです。使用すると、フィールドがどちらであるかをユーザーに表示できます。属性を持つことに慣れているかもしれませんが、必須ではありません。特定のDOMノードを取得するためのメカニズムです(すぐにわかるように)。これは、サーバーからデータをロードすることにより駆動されるコンポーネントの動的な性質を表しています。<div>があります。アンカータグは、ダイアログを開くためのボタンです。隠されたダイアログそのものです。この例では、純粋なHTML5とCSS3を使用しています。ダイアログの表示と非表示に使用されるCSSコードを確認できます(GitHub)。ここでは詳しく説明しません。内部には、入力フィールドの動的リストが挿入され、その後に作成ボタンが続くフォームがあります。イベントハンドラがあります。これは、イベントハンドラを登録するReactの方法です。Reactは、すべてのDOM要素にイベントハンドラーを作成しません。ソリューションがあります。そのインフラストラクチャを管理する必要はなく、代わりに機能コードの作成に集中できます。関数は、最初にイベントが階層をさらに上にバブルするのを停止します。<input>を検索します。名前で特定のReactコンポーネントに手を伸ばして取得する方法です。仮想DOMコンポーネントのみを取得していることに注意してください。実際のDOM要素を取得するには、React.findDOMNode()を使用する必要があります。コールバックを呼び出します。内にあり、このReactコンポーネントに別のプロパティとして提供されました。そのトップレベル関数がどのように動作するかを参照してください。リソースに移動します。インスタンスの文字列ベースの配列は問題ありません。呼び出しが返されます。POSTの結果の処理を処理できます。通常、新しいレコードはデータセットの最後に追加されます。特定のページを見ているため、新しい従業員レコードが現在のページにないことを期待するのは論理的です。これを処理するには、同じページサイズが適用されたデータの新しいバッチをフェッチする必要があります。done()内の最終節に対して返されます。エントリに移動できます。非同期操作を開始し、タスクが完了したときに応答する関数を登録する方法です。約束は、「コールバック地獄」を回避するために一緒に連鎖されるように設計されています。次のフローを参照してください。関数が値であろうと別のpromiseであろうと、何かを返す必要があるということです。関数は何も返しません。チェーンは何も返しません。関数がpromiseを返します。データのページングバックエンドでページングを設定し、新しい従業員を作成するときに既にそれを利用し始めています。ページにジャンプしました。UIに動的に適用し、ユーザーが必要に応じてナビゲートできるようにすることは非常に便利です。利用可能なナビゲーションリンクに基づいてコントロールを動的に調整することは素晴らしいことです。関数を確認しましょう。employeeCollection.entity._links});});}これは、App.onNavigate内の上部で定義されます。繰り返しますが、これは最上位コンポーネントのUIの状態を管理できるようにするためです。Reactコンポーネントに渡した後、次のハンドラーがコーディングされ、一部のボタンのクリックを処理します。{e.preventDefault();this.props.onNavigate(this.props.links.last.href);}これらの各関数はデフォルトイベントをインターセプトし、バブリングを防ぎます。これで、EmployeeList.renderのハイパーメディアリンクに表示されるリンクに基づいて、条件付きでコントロールを表示できます。コンポーネントの配列に変換します。配列をHTMLボタンの配列として構築します。要素内に配置することはできません。代わりに、エンコードされたバージョンを使用する必要があります。挿入されているのを確認できます。既存のレコードを削除するエントリの削除ははるかに簡単です。リンクに適用することだけです。onClick={this.handleDelete}>Delete</button></td></tr>)}}Employeeコンポーネントのこの更新されたバージョンでは、行の最後に追加のエントリ(削除ボタン)が表示されます。呼び出すように登録されます。レコードを提供しながら、渡されたコールバックを呼び出すことができます。これも、1つの場所で最上位コンポーネントの状態を管理するのが最も簡単であることを示しています。これは常にそうであるとは限りません。多くの場合、状態を1か所で管理すると、物事をまっすぐに簡単に保つことが容易になります。コンポーネント固有の詳細(this.props.onDelete(this.props.employee))でコールバックを呼び出すことにより、コンポーネント間の動作を非常に簡単に調整できます。App.onDeleteの先頭にトレースすると、その動作を確認できます。{this.loadFromServer(this.state.pageSize);});}ページベースのUIでレコードを削除した後に適用する動作は少し注意が必要です。この場合、サーバーからデータ全体をリロードし、同じページサイズを適用します。次に、最初のページが表示されます。最後のページの最後のレコードを削除する場合、最初のページにジャンプします。ページサイズの調整ハイパーメディアが実際にどのように輝くかを確認する1つの方法は、ページサイズを更新することです。RESTは、ページサイズに基づいてナビゲーションリンクを流動的に更新します。使用すると、this.refs.pageSizeを使用してその要素を簡単に取得できます。pageSizeで初期化します。ハンドラーを登録します。1);}}イベントの泡立ちを停止します。ヘルパー関数を介してDOMノードを見つけ、その値を抽出します。入力が実際に数字であるかどうかは、数字の文字列であるかどうかを確認してテストします。Reactコンポーネントに送信します。ない場合は、入力した文字が入力から取り除かれます。{this.loadFromServer(pageSize);}}新しいページサイズの値により、すべてのナビゲーションリンクが変更されるため、データを再フェッチして最初から開始することをお勧めします。すべてを一緒に入れてこれらすべての素晴らしい追加により、次のイメージに示すように、UIが大幅に改善されました。ページサイズの設定は上部に、削除ボタンは各行に、ナビゲーションボタンは下部に表示されます。ナビゲーションボタンは、ハイパーメディアコントロールの強力な機能を示しています。これは、ドメイン駆動型メタデータ(JSONスキーマ)と組み合わせたハイパーメディアを使用する力を実際に示しています。Webページは、どのフィールドがどのフィールドであるかを知る必要はありません。代わりに、ユーザーはそれを見て、それを使用する方法を知ることができます。ドメインオブジェクトに別のフィールドを追加した場合、このポップアップは自動的にそれを表示します。RESTのページング機能を有効にしました。ハードコードされたURIパスを捨て、関係名または「rels」と組み合わせたルートURIの使用を開始しました。ページベースのハイパーメディアコントロールを動的に使用するようにUIを更新しました。従業員を作成および削除し、必要に応じてUIを更新する機能を追加しました。ページサイズを変更し、UIが柔軟に応答できるようにしました。課題?Webページを動的にしました。別のブラウザタブを開いて、同じアプリをポイントします。1つのタブを変更しても、他のタブは何も更新されません。次のセクションでその課題に対処します。RESTのハイパーメディアコントロールをオンにし、ページングによってUIをナビゲートし、ページサイズの変更に基づいて動的にサイズを変更する方法を見つけました。従業員を作成および削除し、ページを調整する機能を追加しました。現在編集している同じデータの一部に対して他のユーザーが行った更新を考慮しないと、ソリューションは完成しません。自由に入手して、フォローしてください。このセクションは前のセクションに基づいていますが、追加機能が追加されています。PUTするかしないか?それが質問です。リソースをフェッチするとき、他の誰かがリソースを更新するとリソースが古くなる可能性があります。RESTは、リソースのバージョン管理とETagの2つのテクノロジーを統合します。PATCH)が他の誰かの更新を踏みにじることを防ぐことができます。RESTリソースのバージョン管理リソースのバージョン管理をサポートするには、このタイプの保護を必要とするドメインオブジェクトのバージョン属性を定義します。オブジェクトに対してこれを行うメソッドを示しています。javax.persistence.Versionのアノテーションが付けられています。行が挿入および更新されるたびに、値が自動的に保存および更新されます。前のセクションでは、コレクションリソースを使用してデータを収集し、UIのHTMLテーブルに入力しました。データセットはデータのプレビューと見なされます。ETagsのようなヘッダーを取得するには、データを確認するのに便利ですが、各リソースを個別に取得する必要があります。更新されてコレクションを取得します。次に、URIを使用して個々のリソースを取得できます。コレクションリソースに移動します。句は、JSONスキーマデータをフェッチする呼び出しを作成します。コンポーネントに保存するための内部then句があります。employeeCollectionを返すことに注意してください。すれば、コレクションを次の呼び出しに渡すことができ、途中でメタデータを取得できます。配列に変換し、個々のリソースをフェッチすることを約束します。約束の配列を取り、when.all()で単一の約束にマージします。これは、すべてのGET約束が解決されると解決されます。終わり、このデータの融合を使用してUI状態が更新されます。このチェーンは、他の場所でも実装されています。(異なるページへのジャンプに使用)は、個々のリソースを取得するために更新されます。ここに示されているものとほぼ同じであるため、このセクションでは省略しています。Reactコンポーネントを追加して、既存の従業員レコードを編集します。機能の両方があります。HTML戦術を使用します。JSONスキーマ属性の配列をHTML入力の配列に変換し、スタイル設定のために段落要素でラップします。同じですが、1つの違いがあります。this.props.employeeがロードされます。コンポーネントでは、フィールドは空です。フィールドの構築方法は異なります。リンクのURIに基づいています。key、HTMLアンカータグ、および非表示のポップアップで使用されます。機能にリンクされています。メソッドが呼び出されます。これにより、Reactの片方向バインディングのスタイルが継続され、呼び出し対象の関数が上位コンポーネントから下位コンポーネントにプッシュされます。このように、状態は依然として上部で管理されます。条件付きPUTデータモデルにバージョニングを組み込むために、このすべての努力を行ってきました。RESTは、その値をETag応答ヘッダーとして提供しました。ここで、それを有効に活用できます。RESTは現在のバージョンに対して値をチェックします。Failedで失敗します。errorFunction)として定義しています。これまでのところ、成功関数でのみ使用されるのを見てきました。上記のコードフラグメントには、2つの関数があります。loadFromServerを呼び出しますが、error関数は古いデータに関するブラウザーアラートを表示します。関数にうまくリンクしたら、最後のステップはコンポーネントの既存のレイアウトに接続することです。特定の従業員に直接結び付けられています。Reactコンポーネントで以下にプラグインされていることがわかります。onClick={this.handleDelete}>Delete</button></td></tr>)}}このセクションでは、コレクションリソースの使用から個々のリソースの使用に切り替えます。従業員レコードのフィールドは、this.props.employee.entityにあります。this.props.employee.headersにアクセスできます。)は、このシリーズの一部ではありません。この方法でデータを構造化すると便利です。選択したRESTライブラリとして使用する場合にのみ適切です。別のライブラリを使用する場合は、必要に応じて適応する必要があります。spring-boot:runを実行してアプリケーションを開始します。ブラウザのタブを開き、http://localhost:8080に移動します。次のイメージのようなページが表示されるはずです。Frodoの編集ダイアログを開きます。ブラウザで別のタブを開き、同じレコードを取得します。最初のタブでレコードを変更します。2番目のタブで変更を試みてください。次のイメージに示すように、ブラウザのタブが変更されます。これらの変更により、衝突を回避することでデータの整合性が向上します。フィールドを使用してドメインモデルを構成しました。個々のリソースを取得するようにフロントエンドを調整しました。要求ヘッダーにプラグインして、PUTを条件付きにしました。コーディングしました。これをプラグインすると、他のユーザーとの衝突や編集内容の上書きを簡単に回避できます。課題?悪いレコードを編集しているときを知ることは確かに素晴らしいことです。onNavigateの両方で非常に似ています。Employee.javaにさらに5つのフィールドを追加したいと想像してください。イベント前のセクションでは、同じデータを編集するときに他のユーザーとの衝突を避けるために条件付きリフレッシュを導入しました。楽観的ロックを使用してバックエンドでデータをバージョン管理する方法も学びました。誰かが同じレコードを編集した場合、ページをリフレッシュしてリフレッシュを取得できるようになったときに通知を受け取りました。良いものを知っていますか?他の人がリソースを更新したときにUIを動的に応答させる。RESTの組み込みイベントシステムを使用して、バックエンドの変更を検出し、SpringのWebSocketサポートを通じてすべてのユーザーに更新を公開する方法を学習します。その後、データが更新されると、クライアントを動的に調整できます。自由に入手して、フォローしてください。このセクションは、前のセクションのアプリケーションに基づいており、追加のものが追加されています。WebSocketサポートをプロジェクトに追加する開始する前に、プロジェクトのpom.xmlファイルに依存関係を追加する必要があります。BootのWebSocketスターターをもたらします。Springを使用したWebSocketsの構成Springには強力なWebSocketサポートが付属しています。認識すべきことの1つは、WebSocketが非常に低レベルのプロトコルであることです。クライアントとサーバー間でデータを送信する手段を提供する以上のものはありません。推奨事項は、サブプロトコル(このセクションではSTOMP)を使用して、実際にデータとルートをエンコードすることです。次のコードは、サーバー側でWebSocketサポートを構成します。WebSocketサポートをオンにします。基本機能を構成するための便利な基本クラスを提供します。MESSAGE_PREFIXは、すべてのメッセージのルートに付加するプレフィックスです。クライアントとサーバーがリンクするためのバックエンドでエンドポイントを構成するために使用されます(/payroll)。サーバーとクライアント間でメッセージを中継するために使用されるブローカーを構成するために使用されます。RESTイベントをタップして、WebSocketを介して公開できます。次のコードは、これらのイベントのいくつかをサブスクライブする方法を示しています。このクラスにフラグを立てて、従業員に基づいてイベントをトラップします。アプリケーションコンテキストからオートワイヤーされます。アノテーションは、イベントをリッスンする必要があるメソッドにフラグを立てます。これらのメソッドはパブリックでなければなりません。呼び出して、WebSocketを介してメッセージを送信します。これはpub-subアプローチであるため、接続されているすべてのコンシューマーに1つのメッセージが中継されます。各メッセージのルートは異なり、複数のメッセージをクライアント上の別個の受信者に送信できるようにし、必要なオープンWebSocketは1つだけです(リソース効率の高いアプローチ)。使用して、特定のクラスタイプとIDのパスを検索します。URIに変換されます。単一であれコレクションであれ、さまざまなリソースのパスをプログラムで見つけるためのユーティリティメソッドがいくつか付属しています。基本的に、作成、更新、および削除イベントをリッスンし、イベントが完了した後、それらのイベントの通知をすべてのクライアントに送信します。そのような操作が発生する前にインターセプトし、おそらくログに記録したり、何らかの理由でブロックしたり、ドメインオブジェクトを追加情報で装飾したりできます。次のステップは、WebSocketイベントを消費するためのクライアント側コードを書くことです。メインアプリケーションの次のチャンクはモジュールをプルします。require('./websocket-listener')そのモジュールを以下に示します。JavaScriptライブラリを取り込みます。JavaScriptライブラリをプルして、STOMPサブプロトコルを使用します。エンドポイントに向けます。配列を反復処理して、それぞれがメッセージの到着時にコールバックをサブスクライブできるようにします。callbackがあります。次のセクションでは、イベントハンドラーを登録する方法を確認できます。関数は、DOMでレンダリングされた後に呼び出されます。コンポーネントがオンラインになり、ビジネスの準備が整うため、WebSocketイベントに登録するのに適切なタイミングです。次のコードはそうします。this.refreshCurrentPage}]);}最初の行は以前と同じで、すべての従業員がページサイズを使用してサーバーから取得されます。2行目は、WebSocketイベント用に登録されているJavaScriptオブジェクトの配列を示しています。callbackがあります。新しい従業員が作成されると、動作はデータセットをリフレッシュし、ページングリンクを使用して最後のページに移動します。最後に移動する前にデータをリフレッシュするのはなぜですか?新しいレコードを追加すると、新しいページが作成される可能性があります。これが起こるかどうかを計算することは可能ですが、ハイパーメディアのポイントを覆します。カスタマイズされたページカウントを組み合わせるのではなく、既存のリンクを使用し、パフォーマンスを向上させる理由がある場合にのみその道をたどることをお勧めします。従業員がリフレッシュまたは削除されると、現在のページがリフレッシュされます。レコードをリフレッシュすると、表示しているページに影響します。現在のページのレコードを削除すると、次のページのレコードが現在のページに取り込まれるため、現在のページもリフレッシュする必要があります。/topicで始まるという要件はありません。pub-subセマンティクスを示す一般的な規則です。次のセクションでは、これらの操作を実行する実際の操作を確認できます。次のコードチャンクには、WebSocketイベントを受信したときにUI状態を更新するために使用される2つのコールバックが含まれています。リンクにナビゲートし、this.state.pageSizeをプラグインします。関数を呼び出して、新しいレコードが見つかる最後のページにジャンプします。pageに適用します。これにより、現在表示している同じページが取得され、それに応じて状態が更新されます。この動作は、リフレッシュまたは削除メッセージが送信されたときにすべてのクライアントに現在のページをリフレッシュするように指示します。現在のページが現在のイベントとは関係がない可能性があります。それを把握するのは難しい場合があります。削除されたレコードがページ2にあり、ページ3を見ている場合はどうなりますか?すべてのエントリが変更されます。これは望ましい動作なのでしょうか?多分。ローカル更新から状態管理を移動するこのセクションを完了する前に、認識すべきことがあります。UIの状態を更新する新しい方法、つまりWebSocketメッセージが到着したときを追加しました。状態を更新する古い方法はまだそこにあります。コードの状態管理を簡素化するには、古い方法を削除します。呼び出しを送信しますが、それらの結果を使用してUIの状態を更新しないでください。代わりに、WebSocketイベントが循環するのを待ってから、更新を実行してください。done()がないことに注意してください。refreshAndGoToLastPage()にあります。spring-boot:run)を起動し、アプリケーションを調べます。2つのブラウザタブを開き、サイズを変更して、両方を表示できるようにします。1つで更新を開始し、他のタブがどのように即座に更新されるかを確認します。携帯電話を開き、同じページにアクセスします。友人を見つけて、その人に同じことをするように頼みます。このタイプの動的更新は、より鋭いものになるかもしれません。2つの異なるブラウザタブで同じレコードを開く前のセクションの演習を試してください。一方で更新してみて、もう一方で更新が表示されないようにしてください。コードで保護する必要があります。それを停止のは難しいかもしれません!レビューこのセクションでは、次のことを行います。SockJSフォールバックでSpringのWebSocketサポートを構成しました。RESTからイベントを作成、更新、削除するためにサブスクライブしました。影響を受けるRESTリソースのURIをコンテキストメッセージ(「/topic/newEmployee」、「/topic/updateEmployee」など)とともに公開しました。これらのイベントをリッスンするためにWebSocketリスナーをUIに登録しました。UIの状態を更新するために、リスナーをハンドラーに書き込みました。これらのすべての機能を使用すると、2つのブラウザーを並べて実行し、一方の更新が他方の更新にどのように反映されるかを簡単に確認できます。課題?複数のディスプレイはうまく更新されますが、正確な動作を磨くことが保証されます。例:新しいユーザーを作成すると、すべてのユーザーが最後までジャンプします。これをどのように扱うべきかについての考えはありますか?ページングは便利ですが、管理が難しい状態です。このサンプルアプリケーションのコストは低く、ReactはUIで多くのちらつきを引き起こすことなくDOMを更新するのに非常に効率的です。複雑なアプリケーションでは、これらのアプローチのすべてが適合するわけではありません。ページングを念頭に置いて設計する場合、クライアント間で予想される動作と、更新が必要かどうかを決定する必要があります。システムの要件とパフォーマンスによっては、既存のナビゲーションハイパーメディアで十分な場合があります。FrameworkのWebSocketサポートを使用して、他のユーザーからの更新にアプリを動的に応答させました。適切なユーザーのみがUIとその背後にあるリソースにアクセスできるように、すべてを保護しないと完全なアプリケーションはありません。自由に入手して、フォローしてください。このセクションは、前のセクションのアプリに基づいて追加のものが追加されています。Securityをプロジェクトに追加する開始する前に、プロジェクトのpom.xmlファイルにいくつかの依存関係を追加する必要があります。Securityスターターに加えて、Webページでセキュリティルックアップを行うための追加のThymeleafタグが追加されます。過去のセクションでは、素晴らしい給与システムを使用してきました。RESTに面倒をさせるのは便利です。次のステップは、セキュリティ管理策を講じる必要があるシステムをモデル化することです。これが給与システムの場合、管理者のみがアクセスします。オブジェクトをモデリングして、物事を始めましょう。新しいパスワードを暗号化するか、パスワード入力を取得して比較前に暗号化する手段です。アクセスを制限するために必要なパラメーターを定義します。メソッドにより、パスワードが平文で保存されることはありません。セキュリティ層を設計する際に留意すべき重要な点があります。データ(パスワードなど)の適切な部分を保護し、コンソールに出力したり、ログに記録したり、JSON直列化を通じてエクスポートしたりしないでください。このフィールドを直列化するJacksonから保護します。Dataは、エンティティの管理が非常に得意です。これらのマネージャーを処理するリポジトリを作成してみませんか?次のコードはそうします。CrudRepositoryを継承する代わりに、それほど多くのメソッドは必要ありません。代わりに、データ(更新にも使用される)を保存し、既存のユーザーを検索する必要があります。マーカーインターフェースを使用できます。定義済みの操作はありません。RESTは、デフォルトで、見つかったリポジトリをエクスポートします。このリポジトリをREST操作用に公開することは望ましくありません。アノテーションを適用して、エクスポートをブロックします。これにより、リポジトリとそのメタデータが提供されなくなります。従業員とマネージャーとのリンクセキュリティのモデリングの最後の部分は、従業員をマネージャーに関連付けることです。このドメインでは、従業員は1人のマネージャーを持つことができ、マネージャーは複数の従業員を持つことができます。次のコードはその関係を定義しています。属性によってリンクされています。@OneToManyを必要としません。これは、ルックアップの必要性を定義していないためです。ユーティリティコンストラクター呼び出しが更新され、初期化がサポートされます。Securityは、セキュリティポリシーの定義に関する多数のオプションをサポートしています。操作は従業員のマネージャーに限定されるように制限します。どのマネージャーもログインしてデータを表示できますが、変更を加えることができるのは特定の従業員のマネージャーだけです。次のコードはこれらのゴールを達成します。ROLE_MANAGERを持つ人々へのアクセスを制限します。save()では、従業員のマネージャーがnull(マネージャーが割り当てられていない場合の新しい従業員の最初の作成)であるか、従業員のマネージャーの名前が現在認証されているユーザーの名前と一致します。SecurityのSpEL式を使用してアクセスを定義しています。プロパティナビゲーターが付属しています。使用することに注意することも重要です。見つけ、findOne(id)を実行し、現在認証されているユーザーに対してマネージャーをチェックする必要があります。information.ManagerRepositoryがあるため、この必要なデータをフェッチするためにSQLまたはJPA式を記述する必要はありません。このクラスでは、コンストラクター注入によってオートワイヤーされます。Bootに自動構成されたセキュリティポリシーを削除し、代わりにこのポリシーを使用するように指示します。クイックデモでは、自動構成されたセキュリティで問題ありません。現実のものであれば、自分でポリシーを作成する必要があります。アノテーションでメソッドレベルのセキュリティをオンにします。page.BASICログインもCSRFを無効にして設定されます。これは主にデモンストレーション用であり、慎重な分析のない本番システムには推奨されません。onClick={this.handleDelete}>Delete</button></td></tr>)}}これは、this.props.employee.entity.manager.nameの列を追加するだけです。Metadataデータ出力にフィールドが表示される場合、JSONスキーマメタデータにエントリがあると想定しても安全です。次の抜粋で確認できます。employeeCollection;このコードは、URI関係と$refエントリの両方を削除します。412エラーをキャッチするコードがありました。403ステータスコードがトラップされ、適切なアラートが提供されます。http://localhost:8080。you.レビューこのセクションでは、次のことを行います。forms.管理者は従業員データにアクセスできます。投稿ガイドラインを参照してください(GitHub)。リリースされています。先にジャンプPivotalは、あなたの進歩を加速させるトレーニングと認定を提供します。Tomcat®のサポートとバイナリを提供します。1つの簡単なサブスクリプションで。学習したい方に(英語)今後のイベントSpringOneプラットフォーム(英語)9月21〜24日、シアトルSpringOneツアー(英語)最高のクラウドネイティブJavaコンテンツが直接提供されます。