Как в Spring фильтровать переменные формы?

116
20 сентября 2021, 18:40

Есть проект на Spring Boot
Как мне входящие данные из формы фильтровать? Допустим в объекте TestDTO есть поле phone, до валидации я хочу удалить все не числовые символы и далее валидация, как мне этого достичь?

Есть DTO объект.

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TestDTO {
    @Email
    @NotEmpty(message = "Please provide a email")
    @NotNull
    private String email;
    @Size(min = 10)
    @NotEmpty(message = "Please provide a phone")
    @NotNull
    private String phone;
}

Есть конструктор с методом.

@Log4j2
@Controller
@RequiredArgsConstructor
@RequestMapping("/admin/system")
public class TestController {
    @PostMapping("/contact")
    public ModelAndView contactSave(
            final RedirectAttributes redirectAttributes,
            @Valid TestDTO testDTO,
            BindingResult bindingResult,
            ModelAndView model) {
        log.info(testDTO);
        if (bindingResult.hasErrors()) {
            log.error("Form has error");
        }

        log.error("Form success");
        return model;
    }
}
Answer 1

Решение следующие (если есть более лучшее, пожалуйста добавьте в ответ)
Создаем класс, расширяющий PropertyEditorSupport, далее регистрируем его в контроллоре в WebDataBinder. Наглядно в листинге.

PhoneEditor.class - удаление всех не числовых символов

import org.springframework.stereotype.Component;
import java.beans.PropertyEditorSupport;
@Component
public class PhoneEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if (null != text) {
            // Удаляем все не числовые символы
            this.setValue(text.replaceAll("[\\D]+", ""));
        }
    }
}

TrimEditor.class - для удаление всех пробелов

import org.springframework.stereotype.Component;
import java.beans.PropertyEditorSupport;
@Component
public class TrimEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if (null != text) {
            // Удаляем все пробелы
            this.setValue(text.trim());
        }
    }
}

TestController.class

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import uz.gigalab.ecommerce.editor.PhoneEditor;
import uz.gigalab.ecommerce.editor.TrimEditor;
import javax.validation.Valid;
@Log4j2
@Controller
@RequiredArgsConstructor
public class TestController {
    @InitBinder("contact")
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(String.class, "phone", new PhoneEditor());
        binder.registerCustomEditor(String.class, new TrimEditor());
    }
    @PostMapping("/contact")
    public ModelAndView contactSave(
            @Valid @ModelAttribute("contact") TestDTO testDTO,
            BindingResult bindingResult,
            ModelAndView model) {
        log.info(testDTO);
        if (bindingResult.hasErrors()) {
            log.error("Form has error");
            return model;
        }
        log.error("Form success");
        return model;
    }
}
READ ALSO
Вызов метода класса активности из запущенного сервиса

Вызов метода класса активности из запущенного сервиса

Переустановка Alarm после перезагрузки устройстваУ меня объявлен широковещательный приемник, который запускается при загрузке ОС на устройстве

248
Обновление данных раз в N секунд

Обновление данных раз в N секунд

Есть локальный источник данных:

88
Ошибка NullPointerException при вставке данных из xml

Ошибка NullPointerException при вставке данных из xml

В android studio при запуске эмулятора вылетает такая ошибка -

133
при обучении по Шилдту (непонятен нюанс)

при обучении по Шилдту (непонятен нюанс)

код ниже работает все отлично-непонятно другое int miles мы не задавали значений (расстояния) а задали их int dist = 252; По идее же тут вместо miles должно...

171