私はプロジェクトに取り組んでいます。サーバー側はSpring Boot 2に基づいており、フロントエンドはAngularに基づいています。
サーバー側では、データモデルクラスに次のような宣言があります。
@Column(length = 256, nullable = false)
@Size(max = 256)
private String subject;
フロントエンド(角度側)にもフィールド長の検証を実装したいと思います。
サーバー側とクライアント側の間でフィールド長の制約を共有するための最良のアプローチは何ですか?
私は自分自身を繰り返す必要があるという考えと、両側(サーバー側とクライアント側)でフィールド長をハードコードする必要がありません。
私がこのような定数のセットを宣言する場合、それは私の場合に最適なアプローチですか?
private static final int maxSubjectLength = 256;
次のように使用します。
@Column(length = maxSubjectLength, nullable = false)
@Size(max = maxSubjectLength)
private String subject;
次に、これらの定数を使用して構成クラスを作成します。どのインスタンスにGET
http-requestを介してアクセスできますか?
またはより良いアプローチがありますか?
私は次のアプローチを使用することにしました。Question
プロパティを持つモデルクラスがあるとしますbody
。
@Entity
@Table(name = "Questions")
public final class Question {
// other properties & code
private String body;
// other properties & code
}
また、本体の長さを1024
シンボルに制限し、この制限をサーバーで1回だけ定義し、アプリケーションのバックエンドとフロントエンドでこの制限を使用します。
サーバー側では、モデルクラスでQuestion
、すべてのクラスプロパティのサイズ制限を含む静的マップを定義します。
@Entity
@Table(name = "Questions")
public final class Question {
private static class ModelConstraints {
static final int MAX_BODY_LENGTH = 1024;
// limits for other fields are going here
}
private static final Map<String, Integer> modelConstraintsMap;
static
{
final Map<String, Integer> localConstraintsMap = new HashMap<>();
localConstraintsMap.put("MAX_BODY_LENGTH", ModelConstraints.MAX_BODY_LENGTH);
// .... putting all constants from ModelConstraints to the map here
// composing unmodifable map
modelConstraintsMap = Collections.unmodifiableMap(localConstraintsMap);
}
@Column(length = ModelConstraints.MAX_BODY_LENGTH, nullable = false)
@Size(max = ModelConstraints.MAX_BODY_LENGTH)
private String body;
// other properties and code
public static Map<String, Integer> getModelConstraintsMap() {
return modelConstraintsMap;
}
// other properties and code
}
内部クラスにModelConstraints
は、関連するすべてのモデルプロパティの最大長の値の定義が含まれています。
静的ブロックで、これらの制約を含む変更不可能なマップを作成し、このマップをパブリックメソッドを介して返します。
コントローラーには、モデルクラスに関連して、プロパティの長さの制約を返すレストエンドポイントを追加します。
@RequestMapping(path = "/questions/model-constraints", method = RequestMethod.GET, produces = "application/json")
public ResponseEntity<Map<String, Integer>> getModelConstraints() {
return new ResponseEntity<>(Question.getModelConstraintsMap(), HttpStatus.OK);
}
このメソッドは、プロパティの長さの制約を持つマップのjson表現を返します。
(角度のある)fron-tendでは、このエンドポイントを呼び出しmaxlength
て、モデルクラスプロパティに関連するフォームフィールドのプロパティを設定します。
コンポーネントのtypescriptファイルに、このメソッドを追加して呼び出します。
loadConstraints() {
var url: string = "/questions/model-constraints";
this.http
.get(url)
.subscribe((data: Map<string, number>) => (this.modelConstraints = data));
}
また、このメソッドの呼び出し後、コンポーネントプロパティmodelConstraints
にはフィールド長の制約を持つマップが含まれます。
これらの制約はコンポーネントテンプレート(html)ファイルで設定します。
<textarea
matInput
rows="7"
placeholder="Question body"
maxlength="{{ modelConstraints['MAX_BODY_LENGTH'] }}"
[(ngModel)]="questionBody"
></textarea>
それでおしまい。このアプローチを使用すると、サーバーでフィールド長を1回だけ定義し、サーバーとクライアントでこの定義を使用できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加