CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-io-quarkus--quarkus-bom

Cloud Native, Container First Java framework for building efficient Java applications with fast startup times and low memory usage

Pending
Overview
Eval results
Files

configuration.mddocs/

Configuration Management

Quarkus provides a comprehensive configuration system based on MicroProfile Config with build-time resolution, type-safe configuration mapping, and support for multiple configuration sources including environment variables, system properties, and configuration files.

Configuration Injection

@ConfigProperty Annotation

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface ConfigProperty {
    String name() default "";
    String defaultValue() default ConfigProperty.UNCONFIGURED_VALUE;
    String UNCONFIGURED_VALUE = "<<unset>>";
}

Injects configuration properties into fields or method parameters with optional default values.

Usage Example:

@ApplicationScoped
public class DatabaseService {
    
    @ConfigProperty(name = "database.host", defaultValue = "localhost")
    String host;
    
    @ConfigProperty(name = "database.port", defaultValue = "5432")
    int port;
    
    @ConfigProperty(name = "database.username")
    String username;
    
    @ConfigProperty(name = "database.password")
    Optional<String> password;  // Optional for properties that may not be set
    
    public void connect() {
        System.out.println("Connecting to " + host + ":" + port);
    }
}

Configuration with Profiles

# application.properties
database.host=localhost
database.port=5432

# application-dev.properties  
%dev.database.host=dev-server
%dev.database.port=5433

# application-prod.properties
%prod.database.host=prod-server
%prod.database.port=5434

Configuration values can be overridden per profile using the %{profile}. prefix.

Type-Safe Configuration Mapping

@ConfigMapping Annotation

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ConfigMapping {
    String prefix() default "";
    NamingStrategy namingStrategy() default NamingStrategy.KEBAB_CASE;
}

public enum NamingStrategy {
    KEBAB_CASE,
    SNAKE_CASE,
    VERBATIM
}

Maps configuration properties to type-safe configuration classes.

Usage Example:

@ConfigMapping(prefix = "database")
public interface DatabaseConfig {
    String host();
    int port();
    Optional<String> username();
    Optional<String> password();
    ConnectionPool connectionPool();
    
    interface ConnectionPool {
        @WithDefault("10")
        int maxConnections();
        
        @WithDefault("PT30S")
        Duration timeout();
    }
}

// Usage in a service
@ApplicationScoped
public class DatabaseService {
    
    @Inject
    DatabaseConfig config;
    
    public void connect() {
        System.out.println("Connecting to " + config.host() + ":" + config.port());
        System.out.println("Max connections: " + config.connectionPool().maxConnections());
    }
}

Configuration Mapping Annotations

@Target({ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface WithDefault {
    String value();
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface WithName {
    String value();
}

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface WithParentName {
}

Annotations for customizing configuration mapping behavior.

Usage Example:

@ConfigMapping(prefix = "server")
public interface ServerConfig {
    @WithName("listen-port")
    @WithDefault("8080")
    int port();
    
    @WithDefault("localhost")
    String host();
    
    Ssl ssl();
    
    @WithParentName
    interface Ssl {
        @WithDefault("false")
        boolean enabled();
        
        Optional<String> keystore();
        Optional<String> keystorePassword();
    }
}

Programmatic Configuration Access

ConfigProvider

public class ConfigProvider {
    public static Config getConfig();
    public static Config getConfig(ClassLoader loader);
}

Provides programmatic access to the configuration.

Config Interface

public interface Config {
    <T> T getValue(String propertyName, Class<T> propertyType);
    <T> Optional<T> getOptionalValue(String propertyName, Class<T> propertyType);
    Iterable<String> getPropertyNames();
    Iterable<ConfigSource> getConfigSources();
}

Main configuration access interface.

Usage Example:

@ApplicationScoped
public class ConfigService {
    
    public void printConfig() {
        Config config = ConfigProvider.getConfig();
        
        // Get required value
        String appName = config.getValue("app.name", String.class);
        
        // Get optional value
        Optional<String> version = config.getOptionalValue("app.version", String.class);
        
        // Get value with default
        int timeout = config.getOptionalValue("app.timeout", Integer.class).orElse(30);
        
        System.out.println("App: " + appName + ", Version: " + version.orElse("unknown"));
    }
}

Configuration Sources

Built-in Configuration Sources

  1. System Properties (ordinal: 400)
  2. Environment Variables (ordinal: 300)
  3. application.properties files (ordinal: 250)
  4. application.yaml files (ordinal: 255)
  5. MicroProfile Config properties (ordinal: 100)

Custom Configuration Sources

public interface ConfigSource {
    Map<String, String> getProperties();
    String getValue(String propertyName);
    String getName();
    default int getOrdinal() { return 100; }
}

Interface for implementing custom configuration sources.

Usage Example:

public class DatabaseConfigSource implements ConfigSource {
    
    @Override
    public Map<String, String> getProperties() {
        // Load from database
        return loadFromDatabase();
    }
    
    @Override
    public String getValue(String propertyName) {
        return getProperties().get(propertyName);
    }
    
    @Override
    public String getName() {
        return "DatabaseConfigSource";
    }
    
    @Override
    public int getOrdinal() {
        return 200;  // Higher priority than default files
    }
}

ConfigSourceProvider

public interface ConfigSourceProvider {
    Iterable<ConfigSource> getConfigSources(ClassLoader forClassLoader);
}

Interface for providing multiple configuration sources.

Configuration Validation

@ConfigRoot Annotation

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ConfigRoot {
    ConfigPhase phase() default ConfigPhase.RUN_TIME;
    String name() default "";
}

public enum ConfigPhase {
    BUILD_TIME,
    BUILD_TIME_AND_RUN_TIME,
    RUN_TIME
}

Marks configuration root classes for build-time processing.

@ConfigGroup Annotation

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ConfigGroup {
}

Groups related configuration properties together.

Usage Example:

@ConfigRoot(phase = ConfigPhase.RUN_TIME)
public class AppConfig {
    
    @ConfigItem
    public String name;
    
    @ConfigItem(defaultValue = "INFO")
    public String logLevel;
    
    @ConfigItem
    public DatabaseConfig database;
}

@ConfigGroup
public class DatabaseConfig {
    
    @ConfigItem(defaultValue = "localhost")
    public String host;
    
    @ConfigItem(defaultValue = "5432")
    public int port;
}

Configuration Profiles

Profile Activation

Configuration profiles can be activated using:

  1. System property: -Dquarkus.profile=dev
  2. Environment variable: QUARKUS_PROFILE=dev
  3. application.properties: quarkus.profile=dev
  4. Programmatically: System.setProperty("quarkus.profile", "dev")

Profile-Specific Configuration

# Default configuration
app.timeout=30
database.pool.size=10

# Development profile
%dev.app.timeout=5
%dev.database.pool.size=5

# Production profile  
%prod.app.timeout=60
%prod.database.pool.size=50

# Test profile
%test.app.timeout=1
%test.database.pool.size=1

ProfileManager

public class ProfileManager {
    public static String getActiveProfile();
    public static List<String> getActiveProfiles();
    public static boolean isActiveProfile(String profile);
}

Utility class for profile management.

Usage Example:

@ApplicationScoped
public class EnvironmentService {
    
    public void logEnvironment() {
        String profile = ProfileManager.getActiveProfile();
        System.out.println("Running in profile: " + profile);
        
        if (ProfileManager.isActiveProfile("dev")) {
            System.out.println("Development mode enabled");
        }
    }
}

Configuration Converters

Built-in Converters

Quarkus provides converters for common types:

  • Primitives and their wrappers
  • String
  • Duration (ISO-8601 format)
  • Enums
  • Collections (comma-separated values)
  • Optional wrapper types

Custom Converters

public interface Converter<T> {
    T convert(String value) throws IllegalArgumentException, NullPointerException;
}

Interface for implementing custom type converters.

Usage Example:

public class UriConverter implements Converter<URI> {
    
    @Override
    public URI convert(String value) {
        try {
            return new URI(value);
        } catch (URISyntaxException e) {
            throw new IllegalArgumentException("Invalid URI: " + value, e);
        }
    }
}

// Register in META-INF/services/org.eclipse.microprofile.config.spi.Converter

Configuration Secrets

Encrypted Configuration

@ConfigProperty(name = "database.password")
@Secret
String encryptedPassword;

Configuration values can be encrypted and automatically decrypted at runtime.

Credential Providers

public interface CredentialsProvider {
    Map<String, String> getCredentials(String credentialsProviderName);
}

Interface for implementing custom credential providers (e.g., HashiCorp Vault, AWS Secrets Manager).

Configuration Documentation Generation

@ConfigDocSection

@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ConfigDocSection {
    String name() default "";
    boolean generated() default false;
}

Annotation for documenting configuration sections in generated documentation.

@ConfigDocMapKey

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ConfigDocMapKey {
    String value();
}

Documents map-based configuration properties.

Usage Example:

@ConfigRoot
@ConfigDocSection(name = "Application Configuration")
public class AppConfig {
    
    /**
     * The name of the application
     */
    @ConfigItem
    public String name;
    
    /**
     * HTTP server configuration
     */
    @ConfigItem
    @ConfigDocSection(name = "HTTP Server")
    public HttpConfig http;
    
    /**
     * Feature flags
     */
    @ConfigItem
    @ConfigDocMapKey("feature-name")
    public Map<String, Boolean> features;
}

Install with Tessl CLI

npx tessl i tessl/maven-io-quarkus--quarkus-bom

docs

cdi-dependency-injection.md

configuration.md

core-runtime.md

data-persistence.md

index.md

reactive-programming.md

rest-web-services.md

scheduling.md

security.md

testing.md

tile.json