Проверка запроса Spring Boot - PullRequest
0 голосов
/ 03 июня 2018

Я много читал о проверке весенних запросов.Я прочитал много статей о том, как правильно реализовать это, но у меня есть некоторые проблемы.Это мой код:

RestController:

    @Autowired
EmployeeManager employeeManager;

@Autowired
EmployeeValidator employeeValidator;

@InitBinder("employee")
public void setupBinder(WebDataBinder binder) {
    binder.addValidators(employeeValidator);
}

// -------------- CREATE EMPLOYEES --------------

@PostMapping(value = "add")
public ResponseEntity<EmployeeDTO> addEmployee(@Valid @RequestBody EmployeeDTO employee) {

    boolean isCreated = employeeManager.addEmployee(employee);

    if(isCreated) {
        return new ResponseEntity<>(employee, HttpStatus.CREATED);
    }

    return new ResponseEntity(new CustomError("Unable to create, employee with email " +
            employee.getEmail() + " already exist."), HttpStatus.CONFLICT);
}

Валидатор:

    package com.employee.api.EmployeeAPI.validator;


import com.employee.api.EmployeeAPI.model.dto.EmployeeDTO;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Component
public class EmployeeValidator implements Validator {

    private Pattern pattern;
    private Matcher matcher;

    private static final String STRING_PATTERN = "[a-zA-Z]+";
    private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
            + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";

    @Override
    public boolean supports(Class<?> clazz) {
        return EmployeeDTO.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        EmployeeDTO employee = (EmployeeDTO) target;
        if (validateInputString(employee.getFirstName(), STRING_PATTERN)) {
            errors.rejectValue("firstName", "firstName.invalid");
        }

        if (validateInputString(employee.getLastName(), STRING_PATTERN)) {
            errors.rejectValue("lastName", "lastName.invalid");
        }

        if (validateInputString(employee.getJob(), STRING_PATTERN)) {
            errors.rejectValue("job", "job.invalid");
        }

        if (validateInputString(employee.getEmail(), EMAIL_PATTERN)) {
            errors.rejectValue("email", "email.invalid");
        }
    }

    private boolean validateInputString(String input, String regexPattern) {
        pattern = Pattern.compile(regexPattern);
        matcher = pattern.matcher(input);

        return (!matcher.matches() || input == null || input.trim().length() == 0);
    }

}

и в конфигурации я добавил bean:

@Bean
public EmployeeValidator beforeAddOrUpdateEmployeeValidator() {
    return new EmployeeValidator();
}

IЯ не совсем уверен, как это следует вызывать прямо сейчас при добавлении сотрудников, потому что это, безусловно, не работает на данный момент.Не могли бы вы помочь мне с правильной реализацией или указать правильное направление?

1 Ответ

0 голосов
/ 03 июня 2018

Я не знаком с org.springframework.validation.Validator, но предложу вам, как выполнить ту же проверку, что и вам, с javax.validation.ConstraintValidator ( JSR-303 ).С вашим классом контроллера все в порядке, и никаких изменений там не требуется.

вам нужно создать пользовательскую аннотацию @ValidEmployee и добавить к ней свой dto:

@ValidEmployee
public class EmployeeDto {
    ...
}

Аннотация ValidEmployee:

import javax.validation.Constraint;
import javax.validation.Payload;

@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = EmployeeValidator.class)
@Documented
public @interface ValidEmployee {
    String message() default "{ValidEmployee.message}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

и реализуйте свою логику проверки в методе isValid:

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class EmployeeValidator implements ConstraintValidator<ValidEmployee, EmployeeDto> {

    @Override
    public void initialize(ValidEmployee constraintAnnotation) {
    }

    @Override
    public boolean isValid(EmployeeDto employee, ConstraintValidatorContext context) {
            // do your validation logic
    }

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