БД сервера H2, созданная с помощью Spring, недоступна
Раньше у меня была рабочая установка, в которой я создаю сервер H2 и источник данных, используя свой applicationContext при развертывании файла войны. Моя конфигурация такая:
Затем я определил
С jpaProperty, определенным, чтобы позволить спящему режиму автоматически генерировать все таблицы:
Это работает как шарм, и когда мое приложение развертывается, все таблицы создаются автоматически. Это отлично подходит для тестовой установки, но для производственной версии мы хотели бы отключить автоматическое создание таблиц с помощью спящего режима, и мы хотим сами управлять сценариями создания и миграции sql.
Поэтому я решил использовать пролет в качестве инструмента миграции БД и удалил следующую строку из определения EntityManager:
Кажется, это работает, и база данных создана и имеет минимальный размер, но когда я пытаюсь подключиться к ней с помощью Squirrel, я получаю следующее исключение:

Я ожидал, что если компоненты H2Server и источника данных созданы Spring, БД будет доступна с помощью драйвера, URL-адреса, имени пользователя и пароля.
Моя первая идея заключалась в том, что они не были созданы из-за ленивой инициализации, в то время как создание таблицы гибернации подразумевает, что bean-компоненты действительно инициализируются. Я попытался установить для свойства ленивой инициализации значение false для обоих свойств, но не повезло .
Должно быть, мне чего-то не хватает, но я пока не вижу . Есть ли способ сделать БД доступной для подключений после развертывания приложения?
Как вернуть коды состояния HTTP в приложении Spring Boot
В этом руководстве мы рассмотрим, как возвращать коды состояния HTTP в приложениях Spring Boot с помощью @ResponseStatus, ResponseEntity и ResponseStatusException.
- Автор записи
Вступление
Все инженеры-программисты, которые полагаются на внешние/сторонние сервисы или инструменты по протоколу HTTP, хотели бы знать, были ли приняты их запросы, и если нет, то что происходит.
Ваша роль как разработчика API состоит в том, чтобы обеспечить хороший опыт для ваших пользователей и, среди прочего, удовлетворить этот спрос. Чтобы другим разработчикам было легко определить, возвращает ли ваш API ошибку или нет, вы пройдете долгий путь, а в первом случае – сообщите другим разработчикам почему , чтобы вы продвинулись еще дальше.
Является ли ошибка вызвана внутренней службой API? Прислали ли они непоправимую ценность? Произошел ли полный сбой сервера, обрабатывающего эти запросы?
Сужение возможностей сбоя позволяет разработчикам, использующим ваш сервис, выполнять свою работу более эффективно. Именно здесь в игру вступают коды состояния HTTP с коротким сообщением в теле ответа, описывающим, что происходит.
В этом руководстве мы рассмотрим , как возвращать различные коды состояния HTTP в Spring Boot при разработке REST API.
Что такое Коды Состояния HTTP?
Проще говоря, код состояния HTTP относится к 3-значному коду, который является частью HTTP-ответа сервера. Первая цифра кода описывает категорию, в которую попадает ответ. Это уже дает подсказку для определения того, был ли запрос успешным или нет. Управление по присвоению номеров Интернету (IANA) ведет официальный реестр кодов состояния HTTP. Ниже приведены различные категории:
- Информация (1xx) : Указывает, что запрос был получен и процесс продолжается. Он предупреждает отправителя о необходимости дождаться окончательного ответа.
- Успешно (2xx) : Указывает, что запрос был успешно получен, понят и принят.
- Перенаправление (3xx) : Указывает, что для завершения запроса необходимо предпринять дальнейшие действия.
- Ошибки клиента (4xx) : Указывает, что во время обработки запроса произошла ошибка, и именно клиент вызвал ошибку.
- Ошибки сервера (5xx) : Указывает, что во время обработки запроса произошла ошибка, но она была вызвана сервером.
Хотя список вряд ли является исчерпывающим, вот некоторые из наиболее распространенных HTTP-кодов, с которыми вы столкнетесь:
| Код | Статус | Описание |
| 200 | ОК | Запрос был успешно выполнен. |
| 201 | Созданный | Новый ресурс был успешно создан. |
| 400 | Плохой Запрос | Запрос был недействителен. |
| 401 | Неавторизованный | Запрос не включал маркер аутентификации или срок действия маркера аутентификации истек. |
| 403 | Запрещенный | У клиента не было разрешения на доступ к запрошенному ресурсу. |
| 404 | не найдено | Запрошенный ресурс не был найден. |
| 405 | Метод Не Допускается | Метод HTTP в запросе не поддерживался ресурсом. Например, метод УДАЛЕНИЯ нельзя использовать с API агента. |
| 500 | внутренняя ошибка сервера | Запрос не был выполнен из-за внутренней ошибки на стороне сервера. |
| 503 | Услуга недоступна | Сервер был недоступен. |
Возвращайте коды состояния HTTP при весенней загрузке
Spring Boot делает разработку приложений на основе Spring намного проще, чем когда-либо прежде, и автоматически возвращает соответствующие коды состояния. Если запрос прошел нормально, возвращается 200 OK , в то время как 404 Не найден возвращается, если ресурс не найден на сервере.
Тем не менее, есть много ситуаций, в которых мы хотели бы сами принять решение о коде состояния HTTP, который будет возвращен в ответе, и Spring Boot предоставляет нам несколько способов для этого.
Давайте запустим скелетный проект с помощью Spring Initializr:
Или с помощью пружинного зажима:
У нас будет простой контроллер, Тестовый контроллер :
Здесь мы создадим несколько обработчиков запросов, которые возвращают различные коды состояния с помощью нескольких различных подходов.
Возврат кодов состояния ответа с помощью @ResponseStatus
Эта аннотация принимает в качестве аргумента код состояния HTTP, который должен быть возвращен в ответе. Spring упрощает нашу работу, предоставляя перечисление, содержащее все коды состояния HTTP. Это очень универсальная аннотация, и ее можно использовать в контроллерах на уровне класса или метода, в пользовательских классах исключений и в классах, аннотированных @ControllerAdvice (на уровне класса или метода).
Он работает одинаково как в классах с аннотациями @ControllerAdvice , так и в классах с аннотациями @Controller . В обоих случаях он обычно сопровождается аннотацией @ResponseBody . При использовании на уровне класса все методы класса приведут к ответу с указанным кодом состояния HTTP. Все аннотации уровня метода @ResponseStatus переопределяют код уровня класса, и если @ResponseStatus не связан с методом, который не создает исключение- a 200 возвращается по умолчанию:
Уровень класса @ResponseStatus становится кодом по умолчанию, возвращаемым для всех методов, если только метод не переопределяет его. Обработчик /уровня класса запроса не связан со статусом на уровне метода, поэтому включается статус на уровне класса, возвращающий 503 Недоступную службу , если кто-то попадает в конечную точку. С другой стороны, /уровень метода конечная точка возвращает 200 OK :
@ResponseStatus работает по-другому при использовании в пользовательских классах исключений. Здесь указанный код состояния HTTP будет возвращен в ответе, когда исключение такого типа генерируется, но не перехватывается. Мы подробнее рассмотрим все это в коде в более позднем разделе.
Кроме того, вы можете указать причину , которая автоматически запускает метод HttpServletResponse.sendError () , что означает, что все, что вы вернете, не будет выполнено:
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Хотя, чтобы на самом деле получить причину для отправки с помощью метода sendError () , вам нужно будет установить свойство include-message в application.properties :
Теперь, если мы отправим запрос на /уровень метода :
Это, вероятно, самый простой способ вернуть статус HTTP, но также и жесткий . Мы действительно не можем изменить коды состояния вручную, с помощью кода здесь. Именно здесь вступает в действие класс ResponseEntity .
Возврат кодов состояния ответа с помощью ResponseEntity
Класс ResponseEntity используется, когда мы хотим программно указать все аспекты HTTP-ответа. Это включает в себя заголовки, текст и, конечно же, код состояния. Этот способ является наиболее подробным способом возврата HTTP-ответа при весенней загрузке, но также и наиболее настраиваемым. Многие предпочитают использовать аннотацию @ResponseBody в сочетании с @ResponseStatus , поскольку они проще. Объект ResponseEntity может быть создан с помощью одного из нескольких конструкторов или с помощью метода статического конструктора:
Основное преимущество использования ResponseEntity заключается в том, что вы можете связать его с другой логикой, такой как:
Здесь мы сгенерировали случайное целое число в диапазоне от 1 до 10 и вернули код состояния в зависимости от случайного целого числа. Проверив, является ли случайное значение Int больше, чем 9 , мы дали клиенту 10% вероятность увидеть “Я чайник” Код статуса первоапрельского дурака, добавленный в RFC2324 .
Отправка нескольких запросов на эту конечную точку в конечном итоге вернет:
Возврат кодов состояния ответа с исключением ResponseStatusException
Класс, используемый для возврата кодов состояния в исключительных случаях, – это класс ResponseStatusException . Он используется для возврата определенного сообщения и кода состояния HTTP, который будет возвращен при возникновении ошибки. Это альтернатива использованию @ExceptionHandler и @ControllerAdvice . Обработка исключений с использованием ResponseStatusException считается более детальной. Это позволяет избежать создания ненужных дополнительных классов исключений и уменьшает тесную связь между кодами состояния и самими классами исключений:
Он ведет себя так же, как когда мы задаем причину через @ResponseStatus , поскольку основной механизм тот же – метод sendError() :
Пользовательские классы исключений и Возвращающие коды состояния HTTP
Наконец, еще один способ обработки исключений-через @ResponseStatus и @ControllerAdvice аннотации и пользовательские классы исключений. Хотя ResponseStatusException предпочтительнее, если по какой-либо причине его нет на картинке, вы всегда можете использовать их.
Давайте добавим два обработчика запросов, которые создают новые пользовательские исключения:
Теперь давайте определим эти исключения и их собственные коды по умолчанию @ResponseStatus (которые переопределяют статус на уровне класса):
Наконец, мы создадим @ControllerAdvice контроллер, который используется для настройки того, как Spring Boot управляет исключениями:
Наконец, когда мы запускаем несколько HTTP-запросов, конечная точка , возвращающая Пойманное пользовательское исключение , будет отформатирована в соответствии с @ControllerAdvice , в то время как исключение UnCaughtCustomException не будет:
Вывод
В этом руководстве мы рассмотрели, как возвращать коды состояния HTTP при весенней загрузке с помощью @ResponseStatus , ResponseEntity и ResponseStatusException , а также как определять пользовательские исключения и обрабатывать их как через @ControllerAdvice , так и без него.
Какую ошибку возвращает spring если бд недоступна
Spring: разрешить отсутствие подключения к базе данных
Валидация и обработка исключений с помощью Spring
Spring Boot Rest Controller how to return different HTTP status codes?
I am using Spring Boot for a simple REST API and would like to return a correct HTTP statuscode if something fails.
Being new to Spring and Spring Boot, the basic question is how do i return different status codes when something is ok or fails?
7 Answers 7
There are several options you can use. Quite good way is to use exceptions and class for handling called @ControllerAdvice :
Also you can pass HttpServletResponse to controller method and just set response code:
Please refer to the this great blog post for details: Exception Handling in Spring MVC
In Spring MVC using @ResponseBody annotation is redundant — it’s already included in @RestController annotation.
![]()
One of the way to do this is you can use ResponseEntity as a return object.
![]()
A nice way is to use Spring’s ResponseStatusException
Rather than returning a ResponseEntity or similar you simply throw the ResponseStatusException from the controller with an HttpStatus and cause, for example:
This results in a response to the client containing the HTTP status:
Note: HttpStatus provides many different status codes for your convenience.
Использование Spring ResponseEntity для манипулирования HTTP-ответом
Использование Spring ResponseEntity для управления HTTP-ответом
1. Вступление
Используя Spring, у нас обычно есть много способов достичь той же цели, включая тонкую настройку HTTP-ответов.
В этом коротком руководстве мы увидим, как установить текст, статус и заголовки HTTP-ответа с помощьюResponseEntity.
Дальнейшее чтение:
Получение и проверка данных ответа с гарантированным REST
Посмотрите, как использовать REST-гарантированный для проверки и извлечения ответа из конечной точки REST
Использование Spring @ResponseStatus для установки кода состояния HTTP
Посмотрите на аннотацию @ResponseStatus и как использовать ее для установки кода состояния ответа.
2. ResponseEntityс
ResponseEntityrepresents the whole HTTP response: status code, headers, and body. Из-за этого мы можем использовать его для полной настройки HTTP-ответа.
Если мы хотим использовать его, мы должны вернуть его из конечной точки; Весна позаботится обо всем остальном.
ResponseEntity — это общий тип. В результате мы можем использовать любой тип в качестве тела ответа:
Поскольку мы указываем статус ответа программно, мы можем вернуться с разными кодами состояния для разных сценариев:
Кроме того, мы можем установить заголовки HTTP:
Кроме того,ResponseEntityprovides two nested builder interfaces:HeadersBuilder и его подинтерфейсBodyBuilder. Следовательно, мы можем получить доступ к их возможностям с помощью статических методовResponseEntity.
Простейший случай — это ответ с телом и кодом ответа HTTP 200:
Для самых популярных кодов состояния HTTP мы получаем статические методы:
Кроме того, мы можем использовать методыBodyBuilder status(HttpStatus status) иBodyBuilder status(int status) для установки любого статуса HTTP.
Наконец, с помощьюResponseEntity<T> BodyBuilder.body(T body) мы можем установить тело ответа HTTP:
Мы также можем установить пользовательские заголовки:
Следовательно,BodyBuilder.body() возвращаетResponseEntity вместоBodyBuilder,, это должен быть последний вызов.
Обратите внимание, что с помощьюHeaderBuilder мы не можем установить какие-либо свойства тела ответа.
При возврате объектаResponseEntity<T> из контроллера мы можем получить какое-то исключение или ошибку при обработке запроса и хотели бы получитьreturn error-related information to the user represented as some other type let’s say E.
Spring 3.2 обеспечивает поддержку глобального@ExceptionHandler with the new @ControllerAdvice annotation, обрабатывающего такие сценарии. Для получения более подробной информации обратитесь к нашей существующей статьеhere.
While ResponseEntity is very powerful, we shouldn’t overuse it. В простых случаях есть другие варианты, которые удовлетворяют наши потребности, и они приводят к гораздо более чистому коду.
3. альтернативы
3.1. @ResponseBodyс
В классических приложениях Spring MVC конечные точки обычно возвращают визуализированные HTML-страницы. Иногда нам нужно только вернуть фактические данные, например, когда мы используем конечную точку с AJAX.
В таких случаях мы можем пометить метод обработчика запросов@ResponseBody иSpring treats the result value of the method as the HTTP response body.
Для получения дополнительной информацииthis article is a good place to start.
3.2. @ResponseStatusс
Когда конечная точка успешно возвращается, Spring предоставляет ответ HTTP 200 (ОК). Если конечная точка выдает исключение, Spring ищет обработчик исключений, который сообщает, какой HTTP-статус использовать.
Мы можем пометить эти методы с помощью @ResponseStatus. Следовательно, Springreturns with a custom HTTP status.
Чтобы увидеть больше примеров, посетите нашу статью оcustom status codes.
3.3. Манипулировать ответом напрямую
Spring также позволяет нам напрямую обращаться к объектуjavax.servlet.http.HttpServletResponse; нам нужно только объявить его как аргумент метода:
Поскольку Spring предоставляет абстракции и дополнительные возможности над базовой реализацией,we shouldn’t manipulate the response this way.
4. Заключение
В этой статье мы увидели несколько способов с их преимуществами и недостатками для манипулирования HTTP-ответом в Spring.