Настройки и окружения
Название блога, размер страницы, адрес базы данных не стоит записывать прямо в код: на вашем компьютере и на сервере они разные. Такие значения хранят в файле настроек src/main/resources/application.properties, а код их читает. Окружение (environment) — именованный набор настроек, например dev для разработки и prod для сервера.
Свои настройки
Добавьте строки в файл, созданный генератором:
# src/main/resources/application.properties
micronaut.application.name=blog
blog.title=Java blog
blog.author=AnnaКлючи micronaut.* читает сам фреймворк, ключи blog.* — наши. Значения пишите латиницей: файл .properties читается в кодировке ISO-8859-1, и русский текст превратится в набор вида Ðой блог. Если нужна кириллица, запишите её кодами Unicode: blog.title=\u0411\u043b\u043e\u0433 даст «Блог». Формат YAML (application.yml) тоже поддерживается, если при создании проекта выбрать возможность yaml.
Группа настроек в записи
Несколько связанных значений удобно собрать в одну запись с @ConfigurationProperties:
// src/main/java/com/example/BlogConfig.java
package com.example;
import io.micronaut.context.annotation.ConfigurationProperties;
import io.micronaut.core.bind.annotation.Bindable;
@ConfigurationProperties("blog")
public record BlogConfig(String title, @Bindable(defaultValue = "10") int pageSize) {
}Префикс blog плюс имя компонента дают ключ: title читается из blog.title, а pageSize — из blog.page-size (в файлах принято писать через дефис). Если ключа нет, сработает defaultValue. Запись становится бином — её внедряют, как сервис.
Одно значение через @Value
Для одиночного значения есть @Value с выражением ${ключ}:
// src/main/java/com/example/AboutController.java
package com.example;
import io.micronaut.context.annotation.Value;
import io.micronaut.context.env.Environment;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
@Controller("/about")
public class AboutController {
private final BlogConfig config;
private final Environment environment;
private final String author;
public AboutController(BlogConfig config, Environment environment,
@Value("${blog.author}") String author) {
this.config = config;
this.environment = environment;
this.author = author;
}
@Get
public AboutInfo about() {
return new AboutInfo(config.title(), config.pageSize(), author, environment.getActiveNames());
}
}AboutInfo — запись с @Serdeable и полями title, pageSize, author, environments (тип Set<String>). Запрос curl http://localhost:8080/about вернёт:
{"title":"Java blog","pageSize":10,"author":"Anna"}Список окружений пуст, поэтому в JSON его нет.
Окружения
Создайте рядом файл для окружения dev:
# src/main/resources/application-dev.properties
blog.title=Java blog (dev)
blog.page-size=3Окружение включают переменной MICRONAUT_ENVIRONMENTS или свойством -Dmicronaut.environments=dev:
MICRONAUT_ENVIRONMENTS=dev ./mvnw mn:runВ журнале появится Established active environments: [dev], а /about ответит {"title":"Java blog (dev)","pageSize":3,"author":"Anna","environments":["dev"]}. Значения из application-dev.properties перекрывают общий файл.
Переменные окружения
Любой ключ можно переопределить переменной ОС: точки и дефисы заменяются подчёркиванием, буквы — заглавные. blog.title превращается в BLOG_TITLE:
BLOG_TITLE="Oleg blog" ./mvnw mn:runТак на сервере задают пароли и адреса, не меняя файлы проекта.
Частая ошибка
Если ключа для @Value нет ни в одном источнике, первый запрос к контроллеру вернёт 500, а в журнале будет:
Message: Error resolving property value [${blog.author}]. Property doesn't exist
Path Taken:
new c.e.AboutController(BlogConfig config, Environment environment, @Value String author)Добавьте ключ в application.properties или задайте значение по умолчанию прямо в выражении: @Value("${blog.author:Anna}").