Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Настройки и окружения

Название блога, размер страницы, адрес базы данных не стоит записывать прямо в код: на вашем компьютере и на сервере они разные. Такие значения хранят в файле настроек 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}").

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.