2016-03-31 10 views
2

Ich habe eine Klasse mit Validierung Anmerkungen auf meinen Eigenschaften, wie diese:Wie die Nutzlast Eigenschaft von Bohnen Validierung Anmerkung bekommen

@NotNull(payload = INVALID_CATEGORY_DESCRIPTION.class) 
@Size(min = 1, max = 255, payload = INVALID_CATEGORY_DESCRIPTION_LENGHT.class) 
private String description; 

Dann habe ich ein @ControllerAdvice Validierung Ausnahmen zu behandeln.

@ResponseStatus(BAD_REQUEST) 
@ResponseBody 
@ExceptionHandler(MethodArgumentNotValidException.class) 
public ResponseEntity<?> methodArgumentNotValidException(MethodArgumentNotValidException exception) { 

Wenn eine oder mehrere Validierungsannotationen fehlschlagen, wird der Exception-Handler wie erwartet ausgelöst.

Um die Nutzlasteigenschaft aus den Annotationen zu erhalten, überspringe ich die Felder mit Validierungsfehlern, dann über die Annotationen und vergleiche dann nur den Annotationsnamen mit dem FieldError-Code. Mit der Anmerkung in Händen kann ich auf die Nutzlast zugreifen.

Ich frage mich, ob es eine elegantere Möglichkeit gibt, die Nutzlast oder die Annotation, die die Ausnahme ausgelöst hat, zu erhalten, wie es für die Nachrichteneigenschaft (exception.getMessage()) der Fall ist.

Antwort

1

Angenommen, Ihr Startpunkt ist ein ConstraintViolationException Sie erhalten den Satz von ConstraintViolation Instanzen über getConstraintViolations().

Jede ConstraintViolation hat dann eine getConstraintDescriptor(), die Metadaten über die fehlgeschlagenen Einschränkungen gibt. Sobald Sie die ConstraintDescriptor haben, rufen Sie einfach getPayload().

+0

Vielen Dank @Hardy, das Problem ist der Ausgangspunkt ist MethodArgumentNotValidException, da es keine Validierung durch Code durchführt, es in Annotationen beruht. –