2016-04-11 1 views
7

Когда PathVariable 'name' не проходит проверку, генерируется исключение javax.validation.ConstraintViolationException. Есть ли способ получить имя параметра в метании javax.validation.ConstraintViolationException?Получить имя поля, когда javax.validation.ConstraintViolationException выбрано

@RestController 
@Validated 
public class HelloController { 

@RequestMapping("/hi/{name}") 
public String sayHi(@Size(max = 10, min = 3, message = "name should have between 3 and 10 characters") @PathVariable("name") String name) { 
    return "Hi " + name; 
} 
+1

ли вы это делаете? – ptimson

ответ

5

Следующая Exception Handler показывает, как это работает:

@ExceptionHandler(ConstraintViolationException.class) 

ResponseEntity<Set<String>> handleConstraintViolation(ConstraintViolationException e) { 
    Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations(); 

Set<String> messages = new HashSet<>(constraintViolations.size()); 
messages.addAll(constraintViolations.stream() 
     .map(constraintViolation -> String.format("%s value '%s' %s", constraintViolation.getPropertyPath(), 
       constraintViolation.getInvalidValue(), constraintViolation.getMessage())) 
     .collect(Collectors.toList())); 

return new ResponseEntity<>(messages, HttpStatus.BAD_REQUEST); 

} 

Вы можете получить доступ к недопустимому значению (имя) с

constraintViolation.getInvalidValue() 

Вы можете получить доступ к 'имени' имени свойства с

constraintViolation.getPropertyPath() 
+0

Спасибо Stefan, но я ищу, чтобы получить имя параметра, а не значение. В приведенном выше примере я хотел бы получить доступ к «имени». – Josh

+0

добавил, как получить «имя» –

+7

Я пробовал это, но getPropertyPath возвращает sayHi.arg0 – Josh

2

У меня было t он же проблема, но также получил «sayHi.arg0» от getPropertyPath. Я решил добавить сообщение в аннотации NotNull, поскольку они были частью нашего публичного API. Как:

@NotNull(message = "timezone param is mandatory") 

вы можете получить сообщение, позвонив

ConstraintViolation # GetMessage()

1

использовать этот метод (например, является экземпляром ConstraintViolationException):

Set<ConstraintViolation<?>> set = ex.getConstraintViolations(); 
    List<ErrorField> errorFields = new ArrayList<>(set.size()); 
    ErrorField field = null; 
    for (Iterator<ConstraintViolation<?>> iterator = set.iterator();iterator.hasNext();) { 
     ConstraintViolation<?> next = iterator.next(); 
     System.out.println(((PathImpl)next.getPropertyPath()) 
       .getLeafNode().getName() + " " +next.getMessage()); 


    } 

 Смежные вопросы

  • Нет связанных вопросов^_^