Spring Data Rest с проверкой - PullRequest
       2

Spring Data Rest с проверкой

0 голосов
/ 28 января 2020

Я использую @RepositoryRestResource для создания своего REST API, что позволяет избежать необходимости писать код вручную, как в @RestController, и дает мне хороший ответ HATEOAS. Однако теперь проверки, которые я добавил к своей сущности, не работают, или, скорее, я получаю код ответа 500 вместо 400.

Я попытался использовать @ControllerAdvice + @ExceptionHandler для захвата ConstraintViolationException, однако кажется, что это захватывается до этого и генерируется TransactionSystemException.

Проверка данных - это нечто довольно простое c, и все же по какой-то причине после долгих поисков я не нашел решения.

edit: Показать код:

@ControllerAdvice
public class ConstraintViolationExceptionHandler extends  ResponseEntityExceptionHandler {

    @ExceptionHandler({ ConstraintViolationException.class })
    public ResponseEntity<Object> handleConstraintViolationException(
      Exception ex, WebRequest request) {

          return new ResponseEntity<Object>("test 123", HttpStatus.BAD_REQUEST);
    }
}

Я все еще получаю:

Servlet.service () для сервлета [dispatcherServlet] в контексте с путем [] сгенерировано исключение [Ошибка обработки запроса; вложенным исключением является org.springframework.transaction.TransactionSystemException: не удалось зафиксировать транзакцию JPA; вложенным исключением является javax.persistence.RollbackException: ошибка при фиксации транзакции] с root причиной javax.validation.ConstraintViolationException

Так что кажется, что ConstraintViolationException ранее захватывалось Spring Data REST и TransactionSystemException брошен Если я изменю код для захвата этого исключения, например:

@ControllerAdvice
public class ConstraintViolationExceptionHandler extends  ResponseEntityExceptionHandler {

    @ExceptionHandler({ TransactionSystemException .class })
    public ResponseEntity<Object> handleConstraintViolationException(
      Exception ex, WebRequest request) {

          return new ResponseEntity<Object>("test 123", HttpStatus.BAD_REQUEST);
    }
}

Тогда это сработает, но это не исключение, которое я должен захватывать.

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Вы можете обрабатывать ConstraintViolationException с помощью ControllerAdvice, я пробовал, и он отлично работает, пожалуйста, найдите ниже фрагменты кода для справки.

Пользователь. java

@Entity
@Getter
@Setter

public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NotNull
private String name;

@NotNull
private String surname;
}

UserRepository. java

@RepositoryRestResource
public interface UserRepository extends JpaRepository<User, Long> {
}

GlobalExceptionHandler. java

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(ConstraintViolationException.class)
    public ResponseEntity<?> handlerException(ConstraintViolationException e) {
        final List<Object> errors = new ArrayList<>();
        e.getConstraintViolations().stream().forEach(fieldError -> {
            Map<String, Object> error = new HashMap<>();
            error.put("path", String.valueOf(fieldError.getPropertyPath()));
            error.put("messgae", fieldError.getMessage());
            errors.add(error);
        });
        HttpStatus httpStatus = HttpStatus.BAD_REQUEST;
        Map<String, Object> body = new HashMap<>();
        body.put("error", errors);
        return new ResponseEntity<>(body, httpStatus);
    }
}

Я использовал карту для тела ответа, вы можете использовать объекты в соответствии с требованиями.

Затем попробуйте ниже CURL для тестирования API.

curl --location --request POST 'http://localhost:8080/users' \
--header 'Content-Type: application/json' \
--data-raw '{}'

Ответ будет выглядеть так:

Status: 400 BAD REQUEST
{"error":[{"path":"surname","messgae":"must not be null"},{"path":"name","messgae":"must not be null"}]}
0 голосов
/ 28 января 2020

Spring Data REST предоставляет RepositoryRestExceptionHandler, который содержит метод ResponseEntity<RepositoryConstraintViolationExceptionMessage> handleRepositoryConstraintViolationException(RepositoryConstraintViolationException o_O).

Класс RepositoryRestMvcConfiguration предоставляет компонент для такого обработчика исключений , Если вы хотите изменить его, попробуйте предоставить свой компонент и зарегистрировать его в конфигурации. Вы можете сделать это, например, реализовав RepositoryRestConfigurer, как вы должны быть знакомы с другими проектами Spring (Spring Security, ...).

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