Можем ли мы добавить проверку в тело запроса на основе параметра запроса

У меня есть конечная точка REST, которая принимает объект в теле запроса и параметр запроса. Когда параметр запроса передается, мне нужно проверить все атрибуты объекта, если нет, параметр принимает назначенное значение по умолчанию, и нужно проверить только 2 атрибута. Путь должен быть одинаковым для обоих случаев. Как этого добиться?

В настоящее время у меня есть проверка шаблона, длины и возможных значений для объектов, проверенных с помощью аннотаций.

----- Обновление класса -------

@ValidateParent(parent = "parent ", child= "child")
public class anClass{

    @NotNull(groups = {FrstValidator.class, SndValidator.class})
    @Pattern(regexp = "^[a-zA-Z]{3}$",
            groups = {FrstValidator.class, SndValidator.class})
    String str1;

    @NotNull(groups = {FrstValidator.class, SndValidator.class})
    @Pattern(regexp = "^[a-zA-Z]{3}$",
            groups = {FrstValidator.class, SndValidator.class})
    String str2;

    @Pattern(regexp = "^[a-zA-Z]{10}$",
            groups =  SndValidator.class)
    String child;

    @Pattern(regexp = "^[a-zA-Z]{10}$",
            groups = SndValidator.class)
    String parent;

    @Pattern(regexp = "^[a-zA-Z]{10}$",
            groups = SndValidator.class)
    String str3;


}

ValidateParent проверяет, передается ли родительский элемент при передаче дочернего элемента в теле запроса.


person Ace    schedule 16.10.2020    source источник
comment
Здравствуйте, если параметр запроса передан (пользователем) и его значение совпадает со значением по умолчанию, какая проверка должна выполняться для @RequestBody: все атрибуты, потому что параметр предоставлен, или только 2 - потому что он такой же, как по умолчанию? :)   -  person Alex Rudenko    schedule 17.10.2020
comment
Это может вам помочь: stackoverflow. com/questions/59422883/ и stackoverflow.com/questions/57154986/   -  person YoManTaMero    schedule 17.10.2020
comment
Я обновил класс запроса и примененные проверки. Я думаю, что это может дать вам лучшее представление о проблеме.   -  person Ace    schedule 18.10.2020


Ответы (1)


Вы можете достичь своей цели элегантным способом Spring, используя группы проверки и две отдельные конечные точки, отличающиеся наличием параметра запроса:

Группы проверки:

// Validation groups are just marker interfaces
private interface PartialValidation {}
private interface FullValidation {}

Запрос DTO:

@Data
private static class Request {
    // This field will be validated only for FullValidation validation group
    @NotNull(groups = FullValidation.class)
    String field1;
    // This field will be validated for both validation groups
    @NotNull(groups = {FullValidation.class, PartialValidation.class})
    String field2;
}

Контроллер:

// This endpoint is executed only if there is no myParam preprovided
@PostMapping(
    value = "/validation",
    params = "!myParam")
public void partialValidation(
    @RequestParam(defaultValue = "DEFAULT") String myParam,
    // Request is validated against the PartialValidation group
    @RequestBody @Validated(PartialValidation.class) Request request) {

    System.out.println("Partial validation");
}

// This endpoint is executed only if there is myParam preprovided
@PostMapping(
    value = "/validation",
    params = "myParam")
public void fullValidation(
    @RequestParam String myParam,
    // Request is validated against the FullValidation group
    @RequestBody @Validated(FullValidation.class) Request request) {

    System.out.println("Full validation");
}
person Mafor    schedule 16.10.2020