Я решил использовать следующий подход. Предположим, у нас есть класс модели Question
, который имеет свойство body
.
@Entity
@Table(name = "Questions")
public final class Question {
// other properties & code
private String body;
// other properties & code
}
. И мы хотим ограничить длину тела до 1024
символов и определить это ограничение только один раз на сервере и используйте это ограничение на внутреннем и внешнем интерфейсах приложения.
На стороне сервера в классе нашей модели Question
мы определяем карту stati c, которая содержит ограничения на размер для все свойства класса.
@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
содержит определения значений максимальной длины для всех соответствующих свойств модели.
В блоке stati c я создаю неизменяемую карту, который содержит эти ограничения, и я возвращаю эту карту с помощью метода publi c.
В контроллере, связанном с классом модели, я добавляю конечную точку отдыха, которая возвращает ограничения длины свойства.
@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 -представление карты с ограничениями длины свойства.
На фронте (angular) я вызываю эту конечную точку и устанавливаю maxlength
свойство полей формы Релат Редактирование свойств класса модели.
В файле машинописи компонентов я добавляю и вызываю этот метод:
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>
Вот и все. Используя этот подход, вы можете определить длину поля только один раз на сервере и использовать это определение на сервере и на клиенте.