DatatableExceptionHandler.java
package sk.iway.iwcm.system.datatable;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.TransactionSystemException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
/**
* Title webjet8
* Company Interway a. s. (www.interway.sk)
* Copyright Interway a. s. (c) 2001-2019
* @author tmarcinkova $
* @created 2019/05/10 11:05
*
* Tato trieda spracuje vynimku a vrati response pre DataTable Editor
* - stara sa len o vynimky z tried, ktore maju anotaciu '@Datatable'
*
*/
@ControllerAdvice(annotations = Datatable.class)
public class DatatableExceptionHandler
{
@ExceptionHandler(ConstraintViolationException.class)
public ResponseEntity<DatatableResponse<Object>> handleException(ConstraintViolationException ex) {
DatatableResponse<Object> response = new DatatableResponse<>();
List<DatatableFieldError> errorsList = new ArrayList<>();
if (!ex.getConstraintViolations().isEmpty()) {
for (ConstraintViolation<?> violation : ex.getConstraintViolations()) {
errorsList.add(new DatatableFieldError(violation.getPropertyPath().toString(), violation.getMessage()));
}
response.setFieldErrors(errorsList);
} else {
response.setError(ex.getMessage());
}
return new ResponseEntity<>(response, null, HttpStatus.OK);
}
@ExceptionHandler(TransactionSystemException.class)
public ResponseEntity<DatatableResponse<Object>> handleException(TransactionSystemException ex) {
DatatableResponse<Object> response = new DatatableResponse<>();
List<DatatableFieldError> errorsList = new ArrayList<>();
Throwable t = ex.getCause();
while ((t != null) && !(t instanceof ConstraintViolationException)) {
t = t.getCause();
}
if (t instanceof ConstraintViolationException) {
// Here you're sure you have a ConstraintViolationException, you can handle it
Set<ConstraintViolation<?>> violations = ((ConstraintViolationException) t).getConstraintViolations();
if (!violations.isEmpty()) {
for (ConstraintViolation<?> violation : violations) {
errorsList.add(new DatatableFieldError(violation.getPropertyPath().toString(), violation.getMessage()));
}
}
} else {
response.setError(ex.getMessage());
}
return new ResponseEntity<>(response, null, HttpStatus.OK);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<DatatableResponse<Object>> handleException(Exception ex) {
DatatableResponse<Object> response = new DatatableResponse<>();
response.setError("exception: " + ex.getMessage());
return new ResponseEntity<>(response, null, HttpStatus.OK);
}
}