Как написать пользовательскую проверку в остальные API? - PullRequest
0 голосов
/ 15 мая 2019

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

@RestController
@Api(description = "The Mailer controller which provides send email functionality")
@Validated
public class SendMailController {
    @Autowired
    public SendMailService sendemailService;
    org.slf4j.Logger logger = LoggerFactory.getLogger(SendMailService.class);

    @RequestMapping(method = RequestMethod.POST, value = "/sendMail", consumes = {MediaType.TEXT_XML_VALUE, MediaType.APPLICATION_JSON_VALUE}, produces = {"text/xml", "application/json"})
    @ResponseBody
    @Async(value = "threadPoolTaskExecutor")
    @ApiOperation("The main service operation which sends one mail to one or may recipient as per the configurations in the request body")
    public Future<SendMailResult> sendMail(@ApiParam("Contains the mail content and configurations to be used for sending mail") @Valid @RequestBody MailMessage message) throws InterruptedException {

        SendMailResult results = new SendMailResult();
        try {
            sendemailService.sendMessages(message);
            long txnid = sendemailService.createAudit (message);
            results.setTxnid (txnid);
            results.setStatus("SUCCESS");
        } catch(MessagingException | EmailServiceException e) {
            logger.error("Exception while processing sendMail " + e);
            results.setStatus("FAILED");
            // TODO Handle error create results
            e.printStackTrace();
        } catch(Exception e) {
            logger.error("Something went wrong " + e);
            results.setStatus("FAILED");
            // TODO Handle error create results
            e.printStackTrace();
        }

        return new AsyncResult<SendMailResult>(results);
    }

}

один DTO, сопоставленный с запросом

public class MailContext {
    @NotNull
    private String clientId;
    @NotNull
    private String consumer;


    public int getClientId() {
        return Integer.parseInt(clientId);
    }

    public void setClientId(String clientId) {
        this.clientId = clientId;
    }


    public String toJson() throws JsonProcessingException {

        ObjectMapper mapper = new ObjectMapper();
        String writeValueAsString = mapper.writeValueAsString(this);
        return writeValueAsString;
    }
    }

Запрос xml

<mailMessage>
    <mailContext>
        <clientId>10018</clientId>
        <consumer>1</consumer>
    </mailContext>
</mailMessage>
  1. Я хочу написать пользовательскую аннотацию для проверки клиента, который существует в базе данных (таблица client_tbl), если он указан в запросе.
  2. потребитель: присутствует в таблице базы данных cunsumer_tbl

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

Подскажите, пожалуйста, как написать такую ​​пользовательскую аннотацию с ошибкой.

1 Ответ

1 голос
/ 15 мая 2019

Я знаю другой способ проверить это. Внутри вашего контроллера вы можете зарегистрировать валидатор.

@InitBinder
public void setup(WebDataBinder webDataBinder) {
    webDataBinder.addValidators(dtoValidator);
}

Где dtoValidator, например, является экземпляром Spring Bean, который должен реализовывать org.springframework.validation.Validator.

Итак, вам просто нужно реализовать два метода: support () и validate (объектная цель, ошибки ошибок);

Внутри метода support () вы можете делать все, что захотите, чтобы решить, должен ли объект проверяться этим валидатором или нет. (например, вы можете создать интерфейс WithClientIdDto и, если тестируемый объект isAssignableFrom () этот интерфейс, вы можете выполнить эту проверку. Или вы можете проверить, представлена ​​ли ваша пользовательская аннотация в любом поле с использованием отражения)

Например: (AuthDtoValidator.class)

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

@Override
public void validate(Object target, Errors errors) {
    final AuthDto dto = (AuthDto) target;
    final String phone = dto.getPhone();
    if (StringUtils.isEmpty(phone) && StringUtils.isEmpty(dto.getEmail())) {
        errors.rejectValue("email", "", "The phone or the email should be defined!");
        errors.rejectValue("phone", "", "The phone or the email should be defined!");
    }

    if (!StringUtils.isEmpty(phone)) {
        validatePhone(errors, phone);
    }
}

UPDATE: Вы можете сделать это.

Создать аннотацию например:

@Target({ FIELD })
@Retention(RUNTIME)
@Constraint(validatedBy = ClientIdValidator.class)
@Documented
public @interface ClientId {

  String message() default "{some msg}";

  Class<?>[] groups() default { };

  Class<? extends Payload>[] payload() default { };

}

и реализовать этот валидатор:

class ClientIdValidator implements ConstraintValidator<ClientId, Long> {

  @Override
  public boolean isValid(Long value, ConstraintValidatorContext context) {
   //validation logc
   }
}

Подробнее вы можете найти здесь: https://reflectoring.io/bean-validation-with-spring-boot/

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