Как узнать, принадлежит ли ConstraintViolation свойству JSON или параметру URL? - PullRequest
0 голосов
/ 08 мая 2018

У меня есть код, который получает данные от пользователя и скорее проверяет, действителен он или нет.

Валидация данных из URL и данных из JSON.

Проблема в том, что в случае URL поле пути содержит arg0 и что мне требуется взять его из message:

@ValidId (message = "The field is invalid")
private Long field;

аннотация поля.

В случае JSON я просто могу получить поле от path.substring(path.lastIndexOf('.') + 1).

* * 1 022 * т.е. 1023 *
protected String buildErrorMessage(ConstraintViolation<?> violation) {
    String path = violation.getPropertyPath().toString();
    String field = path.substring(path.lastIndexOf('.') + 1);
    //field = `arg0` in case of url
    //field = `field` in case of JSON
}

Если я столкнулся с ConstraintViolation - как я могу узнать, было ли нарушение от JSON или GET?


EDIT

Здесь я вызываю buildErrorMessage из -

public class ValidationExceptionMapper implements ExceptionMapper<ValidationException> {

    @Override
    public Response toResponse(ValidationException exception) {

        if (exception instanceof ConstraintViolationException) {

            final ConstraintViolationException constraint = (ConstraintViolationException) exception;

            for (final ConstraintViolation<?> violation : constraint.getConstraintViolations()) {
                String message = buildErrorMessage(violation); //HERE
            }
}

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Вот некоторые шаги, которые могут быть полезны при реализации ExceptionMapper, чтобы проверить, относится ли ConstraintViolation к неверному параметру, отправленному в URL или связано с недопустимым свойством, отправленным в полезной нагрузке JSON :

  • Получить свойство Path из ConstraintViolation с использованием метода getPropertyPath();
  • Найдите лист Node из собственности Path;
  • Проверьте тип Node, используя метод getKind().
  • Обращайтесь с этим соответственно.

Имейте в виду, что аннотации параметров, такие как @QueryParam, @PathParam и @MatrixParam, могут быть размещены в параметре метода, поле класса ресурса , или свойство bean класса ресурсов.


Я бы порекомендовал вам взглянуть на мою реализацию ExceptionMapper для ConstraintViolationException, доступную в GitHub .

0 голосов
/ 17 мая 2018

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

public static HttpServletRequest getCurrentHttpRequest(){
    RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
    if (requestAttributes instanceof ServletRequestAttributes) {
        HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();
        return request;
    }
    logger.debug("Not called in the context of an HTTP request");
    return null;
}

 if(getCurrentHttpRequest().getMethod().toLowerCase()=='get'){
     // text
 }
0 голосов
/ 14 мая 2018

Под GET вы подразумеваете TEXT, поскольку GET - это тип HTTP-запроса, который вы отправляете, а JSON / TEXT .... - это тип / формат данных, которые вы отправляете на сервер.

Вы можетеиспользуйте приведенный ниже фрагмент кода

 String contentType = request.getContentType();
          if (contentType != null && !contentType.toLowerCase(Locale.US).startsWith(MediaType.APPLICATION_JSON)) {
           //Request is JSON type
          }
    else {
    //Request is TEXT 
    }

. Он проверяет ContentType запроса, если это JSON или TEXT

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