Совместное использование полевых ограничений между сервером и клиентом - PullRequest
1 голос
/ 25 января 2020

Я работаю над проектом, в котором сторона сервера основана на Spring Boot 2, а интерфейс - на Angular.

На стороне сервера в классах модели данных у меня есть объявления вот так:

@Column(length = 256, nullable = false)
@Size(max = 256)
private String subject;

Я хотел бы реализовать проверку длины поля также на внешней стороне (angular сторона).

Каков наилучший подход для разделения ограничений длины поля между на стороне сервера и клиента?

Мне не нравится идея, что мне нужно повторять себя и длину поля жесткого кода с обеих сторон (сторона сервера и клиента).

Является ли это лучшим подход в моем случае, если я объявляю набор констант следующим образом:

private static final int maxSubjectLength = 256;

И использую их следующим образом:

@Column(length = maxSubjectLength, nullable = false)
@Size(max = maxSubjectLength)
private String subject;

Затем создайте класс конфигурации с этими константами, экземпляр которого доступен через GET http-запрос?

или есть лучший подход?

1 Ответ

0 голосов
/ 11 февраля 2020

Я решил использовать следующий подход. Предположим, у нас есть класс модели 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>

Вот и все. Используя этот подход, вы можете определить длину поля только один раз на сервере и использовать это определение на сервере и на клиенте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...