powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring validation
19 сообщений из 19, страница 1 из 1
Spring validation
    #39204607
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Есть метод контроллера:
Код: java
1.
2.
3.
4.
    @RequestMapping(value = "/somePath", method = RequestMethod.POST)
    @ResponseBody
    public MyResponse createOrder(@RequestBody MyRequest request){
....


Вместе с request-ом прилетает класс SomeClass с кучей полей внутри этого SomeClass, которые необходимо проверить. Проверить не только на не пустоту, но и с отдельными запросами к базе, например, чтобы проверить какие-то остатки и т.д.
Код: java
1.
2.
public class MyRequest{
  private SomeClass someClasss;


Так вот, такую проверку можно вынести в отдельный класс и проверять там, а можно так же выделить класс, но при этом реализовать интерфейс implements Validator. Все ошибки, которые связаны с проверками я генерирую таким образом: throw new MyException("Пользователь не найден"), далее ControllerAdvice отлавливает их и возвращает пользователю json ответ. Как видно, у меня нет никаких ModelAndView. Корректно ли в данном случае использовать org.springframework.validation.Validator? Кто как делает подобные вещи? И еще, как валидация спринговая связана с валидацией хибернейта? Правильно ли я понимаю, что спринг валидация это некая первичная проверка, а далее вторичная на уровне доменного класса?
Спасибо.
...
Рейтинг: 0 / 0
Spring validation
    #39204671
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,


Можно еще в SomeClass навесить аннотации валидации на поля... :-)
...
Рейтинг: 0 / 0
Spring validation
    #39204694
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
@Component
public class MyCompanyValidator implements Validator {
    @Override
    public boolean supports(Class<?> clazz) {
        return false;
    }

    @Override
    public void validate(Object target, Errors errors) {
        MyCompany myCompany = (MyCompany)target;
        if(myCompany.getName().length()<2){
            errors.rejectValue("name","name.incorrect");
        }

        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "info", "info.incorrect");

    }
}



а в контроллере это:

Код: java
1.
2.
3.
4.
5.
validator.validate(myCompany, result);


        if(result.hasErrors()){
            чо-нибудь делаем, возвращаем другой объект или измененный объект с инфой об ошибках или что угодно еще.
...
Рейтинг: 0 / 0
Spring validation
    #39204797
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
@Component
public class MyCompanyValidator implements Validator {
    @Override
    public boolean supports(Class<?> clazz) {
        return false;
    }

    @Override
    public void validate(Object target, Errors errors) {
        MyCompany myCompany = (MyCompany)target;
        if(myCompany.getName().length()<2){
            errors.rejectValue("name","name.incorrect");
        }

        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "info", "info.incorrect");

    }
}



а в контроллере это:

Код: java
1.
2.
3.
4.
5.
validator.validate(myCompany, result);


        if(result.hasErrors()){
            чо-нибудь делаем, возвращаем другой объект или измененный объект с инфой об ошибках или что угодно еще.


спасибо, с этим проблем нет, мне интересно на сколько корректно делать так:
Код: java
1.
2.
3.
4.
5.
6.
 @Override
    public void validate(Object target, Errors errors) {
        MyCompany myCompany = (MyCompany)target;
        if(myCompany.getName().length()<2){
               throw new MyException("Exception");
        }


Т.е. генерировать исключение прямо в методе validate?
...
Рейтинг: 0 / 0
Spring validation
    #39204799
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgulJulT,


Можно еще в SomeClass навесить аннотации валидации на поля... :-)
это не красивое решение, как мне показалось)) спасибо
...
Рейтинг: 0 / 0
Spring validation
    #39204878
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JulT,

а смысл? специально для этого предназначенный объект возвращается - резалт. там еще много интересных полей. а ты изобретать велосипед вытаешься.
...
Рейтинг: 0 / 0
Spring validation
    #39204884
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO надо различать валидацию полей и проверку БЛ.
Например, "пользователь не найден" это БЛ и делать следует в сервисном слое.
Т.е. запросы к БД делать в сервисном слое.
Валидацию лучше на клиенте, ну или продублировать как тут указано выше разными способами.
imho
...
Рейтинг: 0 / 0
Spring validation
    #39204931
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

тогда уж валидить поля (на длину там или числа) в самой форме на клиенте, а бл это бл.
...
Рейтинг: 0 / 0
Spring validation
    #39204942
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. все-таки валидация через implements Validator это некая первичная проверка, которая по хорошему должна быть реализована на клиенте, а все остальные проверки уходят в сервисный слой. ок, спасибо, поняла
...
Рейтинг: 0 / 0
Spring validation
    #39204951
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну там в принципе тоже можно засунуть скажем какую то обращалку в бд. не вижу проблемы если честно. тут скорее вопрос архитектуры. а так, имхо, это когда на голом жсп пишешь важно а если ты там что то с рестом мутишь то наверное можно и на клиенте я так думаю. смотря что. допустим, ты банк и тебе надо клиенту дать возможность перевода денег себе на другой счет у чела сто рублей на счету тут то ты явно не будешь делать валидацию на клиенте? а спринг раз и готовый валидатор тебе сует. не хочешь его валидатором пользоваться - пожалуйста распарсивай объект сам..
...
Рейтинг: 0 / 0
Spring validation
    #39204971
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2,
спасибо!
...
Рейтинг: 0 / 0
Spring validation
    #39205017
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2Petro123,
тогда уж валидить поля (на длину там или числа) в самой форме на клиенте, а бл это бл.
я про это и говорю.
Просто аффтар сбил карты своим "Пользователь не найден". Это без базы в центре не узнать.
У меня юзверя вообще ругаются если при ошибке по полям пропадают данные уже введённые (перезапрос странички).
Приходится на JS или AJAX решать.
...
Рейтинг: 0 / 0
Spring validation
    #39205075
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну чтоб введенные данные не пропадали нужно просто назад возвращать модель атрибутом во вьюшку

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String addMyCompanyPost(ModelMap modelMap, @ModelAttribute MyCompany myCompany,
                                   BindingResult result,
                                   RedirectAttributes redirectAttributes) {
        validator.validate(myCompany, result);


        if(result.hasErrors()){
            modelMap.addAttribute("myCompany", myCompany);
         return "/auth/mycompany/mycompanyadd";
...
Рейтинг: 0 / 0
Spring validation
    #39205093
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2,
ок. Надо попробовать).
...
Рейтинг: 0 / 0
Spring validation
    #39205103
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2ну чтоб введенные данные не пропадали нужно просто назад возвращать модель атрибутом во вьюшку

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String addMyCompanyPost(ModelMap modelMap, @ModelAttribute MyCompany myCompany,
                                   BindingResult result,
                                   RedirectAttributes redirectAttributes) {
        validator.validate(myCompany, result);


        if(result.hasErrors()){
            modelMap.addAttribute("myCompany", myCompany);
         return "/auth/mycompany/mycompanyadd";


1)в вашем примере пользователя сразу перебросит на return "/auth/mycompany/mycompanyadd"
2)для чего в данном случае redirectAttributes?
3)а если сразу несколько разных пользователей открывают и дергают /add, и получают ошибку? в данном случае для каждого пользователя будет вызван свой изолированный modelMap.addAttribute("myCompany", myCompany); ? т.е. у каждого своя копия будет в рамках сессии?
...
Рейтинг: 0 / 0
Spring validation
    #39205229
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JulT,

редиректатрибьютс нужен для того чтоб с поста перслать назад на гет с нужными атрибутами, это надо для того чтоб хотя бы чел тупо на форме ф5 не нажал и второй-третий-десятый раз пост запрос не отправил. редиректить форму, не прошедшую валидацию смысла как ты понимаешь нет. - это на 1-2 ответ

на 3) это не твоя головная боль, а спринга :) по факту же бины инициализируются как синглтоны, т.е. все глобальные переменные или как их там внутри бина будут доступны всем методам вызванными всеми пользователями. что там внутри метода происходит - происходит только для одного пользователя. если же ты хочешь весь бин изолированный то определяй скоуп бина. их три: сингл, сессия и еще какой я забыл на реквест кажется. по умолчанию сингл. в случае сессии поля бина будут свои для каждой отдельной сессии.
возвращаясь к твоему вопросу: каждый юзер в метод передаст СВОЙ майКомпани, следовательно у каждого майкомпани по-своему и отработается в зависимости от содержимого полей. но вот если ты при скоупе по-умолчанию сделаешь в методе /адд зис.майкомпани=майкомпани, вот тогда будет интереснее ))
...
Рейтинг: 0 / 0
Spring validation
    #39205234
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и да, если делаешь редиректатрибут в случае ошибки, то, собссно ошибка валидации не передается на форму в гетовый контроллере, там надо видимо, биндингрезалт передавать в гет. но, если честно я смысла не вижу в этом.
...
Рейтинг: 0 / 0
Spring validation
    #39205363
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо!)
т.е., получается, что вызов конкретного метода происходит в отдельном потоке, а это поток, интересно, создает веб контейнер(томкат и т.д.) или сам спринг? на сколько я помню это делает томкат
...
Рейтинг: 0 / 0
Spring validation
    #39205827
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да незачта собссно. ну, за "биновость" отвечает как минимум спринг. за всё остальное - сервлет контейнер.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring validation
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]