Пружинная загрузка - объединение DTO и проверки формы - PullRequest
0 голосов
/ 29 октября 2018

В настоящее время я разрабатываю API, в котором впервые использую DTO. До сих пор я использовал проверку формы Spring с javax.validation.

Таким образом, мой вопрос, есть ли способ объединить как DTO, так и проверку формы. Позвольте мне объяснить: скажем, у меня есть сервис для входа и еще один для регистрации. В сервисе для регистрации у нас есть: имя, пароль и адрес электронной почты, 3 из них должны быть заполнены. Что касается услуги входа в систему, то должны быть заполнены только адрес электронной почты и пароль. Так что у нас будет что-то вроде:

private String name;
private String password;
private String email;

До сих пор я создавал POJO для каждого запроса (формы), а затем использовал аннотации, такие как @NotNull, но теперь с DTO в проекте, в котором я сейчас нахожусь, у них просто один и тот же DTO и бизнес-объект с те же свойства и без ограничений.

Как я мог делать то, что обычно делал? Проверка полей, которые должны быть не нулевыми в контроллере, выглядит немного грязной для меня, и я не могу просто вставить что-то вроде @NotNull в UserDTO, потому что тогда в двух примерах я сказал, что мне нужно будет отправить также name при входе в систему, хотя она не нужна для этой службы.

Итак, как я могу объединить эти 2 вещи? Это что-то не возможно или есть лучший подход?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Использование групп для проверки с javax.validation сделало свою работу. Я следовал за ответом в этом вопросе (как предложил Эндрю), затем мне просто нужно было поместить каждое поле, которое я хотел, чтобы разные правила были в разных группах.

0 голосов
/ 29 октября 2018

Я предполагаю, что вы используете два отдельных контроллера для входа в систему и регистрации запросов. И если это так, то вы можете использовать интерфейс org.springframework.validation.Validator:

@Component("registrationValidator")
public class RegistrationValidatorImpl implements Validator {

    @Override
    public boolean supports(final Class<?> aClass) {
    }

    @Override
    public void validate(final Object o, final Errors errors) {
    }
}

Создайте RegistrationValidatorImpl и LoginValidatorIml и @Autowire в контроллерах.

Использование валидатора очень просто:

invokeValidator(registrationValidator, someDTO, errors);

if (errors.hasErrors()) {
    return new ResponseEntity(HttpStatus.BAD_REQUEST); //or whatever logic here
}

Подпись метода контроллера должна быть такой:

@RequestMapping(value = "/register", method = RequestMethod.POST)
public ResponseEntity register(@RequestBody final SomeDTO someDTO, final HttpServletRequest request, final Errors errors) {}

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

...