ONNX-based Transformer models for text embeddings within the Spring AI framework
Configure the TransformersEmbeddingModel using Spring Boot's application properties or YAML files. The auto-configuration module provides property-based configuration that eliminates the need for manual bean creation and initialization.
All configuration properties use the spring.ai.embedding.transformer prefix. The auto-configuration automatically creates and initializes a TransformersEmbeddingModel bean based on these properties.
/**
* Configuration properties prefix for Transformer Embedding model.
*/
public static final String CONFIG_PREFIX = "spring.ai.embedding.transformer";Property Naming Conventions:
# Dot notation (properties files)
spring.ai.embedding.transformer.cache.enabled=true
# Environment variable (uppercase with underscores)
SPRING_AI_EMBEDDING_TRANSFORMER_CACHE_ENABLED=true
# System property (dot notation)
-Dspring.ai.embedding.transformer.cache.enabled=trueControl how Document metadata is included in embeddings. Applies only to embed(Document) method.
/**
* Specifies what parts of the Document's content and metadata will be used
* for computing the embeddings.
*/
private MetadataMode metadataMode = MetadataMode.NONE;
public MetadataMode getMetadataMode();
public void setMetadataMode(MetadataMode metadataMode);application.properties:
spring.ai.embedding.transformer.metadata-mode=NONE
# Options: NONE, EMBED, ALL
# Default: NONEapplication.yaml:
spring:
ai:
embedding:
transformer:
metadata-mode: NONE # NONE, EMBED, or ALLDefault: NONE (document text only, no metadata)
MetadataMode Values:
// NONE: Embed text content only (default)
spring.ai.embedding.transformer.metadata-mode=NONE
// EMBED: Include metadata in embedding
spring.ai.embedding.transformer.metadata-mode=EMBED
// ALL: Include all metadata fields
spring.ai.embedding.transformer.metadata-mode=ALLUsage Examples:
# Development: No metadata
spring.ai.embedding.transformer.metadata-mode=NONE
# Production: Include relevant metadata for better search
spring.ai.embedding.transformer.metadata-mode=EMBED
# Testing: All metadata for debugging
spring.ai.embedding.transformer.metadata-mode=ALLEdge Cases:
# Invalid value - application fails to start
spring.ai.embedding.transformer.metadata-mode=INVALID
# Error: Failed to convert property value of type 'java.lang.String' to required type 'MetadataMode'
# Empty value - uses default (NONE)
spring.ai.embedding.transformer.metadata-mode=
# Case sensitivity - must be uppercase
spring.ai.embedding.transformer.metadata-mode=none # ERROR
spring.ai.embedding.transformer.metadata-mode=NONE # CORRECTConfigure the HuggingFace tokenizer resource and options.
/**
* Configurations for the HuggingFaceTokenizer used to convert sentences into tokens.
*/
public static class Tokenizer {
/**
* URI of a pre-trained HuggingFaceTokenizer created by the ONNX engine (e.g. tokenizer.json).
*/
private String uri = TransformersEmbeddingModel.DEFAULT_ONNX_TOKENIZER_URI;
/**
* HuggingFaceTokenizer options such as 'addSpecialTokens', 'modelMaxLength',
* 'truncation', 'padding', 'maxLength', 'stride' and 'padToMultipleOf'.
* Leave empty to fall back to the defaults.
*/
private final Map<String, String> options = new HashMap<>();
public String getUri();
public void setUri(String uri);
public Map<String, String> getOptions();
}application.properties:
# Tokenizer resource URI
spring.ai.embedding.transformer.tokenizer.uri=classpath:/tokenizers/custom-tokenizer.json
# From classpath
spring.ai.embedding.transformer.tokenizer.uri=classpath:/tokenizers/tokenizer.json
# From filesystem (absolute path)
spring.ai.embedding.transformer.tokenizer.uri=file:///path/to/tokenizer.json
# From URL
spring.ai.embedding.transformer.tokenizer.uri=https://example.com/tokenizers/tokenizer.json
# Using environment variable
spring.ai.embedding.transformer.tokenizer.uri=${TOKENIZER_URI:classpath:/tokenizers/default.json}application.yaml:
spring:
ai:
embedding:
transformer:
tokenizer:
uri: classpath:/tokenizers/custom-tokenizer.jsonDefault URI: https://raw.githubusercontent.com/spring-projects/spring-ai/main/models/spring-ai-transformers/src/main/resources/onnx/all-MiniLM-L6-v2/tokenizer.json
application.properties:
# Tokenizer options (all values are strings)
spring.ai.embedding.transformer.tokenizer.options.addSpecialTokens=true
spring.ai.embedding.transformer.tokenizer.options.modelMaxLength=512
spring.ai.embedding.transformer.tokenizer.options.truncation=true
spring.ai.embedding.transformer.tokenizer.options.padding=true
spring.ai.embedding.transformer.tokenizer.options.maxLength=512
spring.ai.embedding.transformer.tokenizer.options.stride=128
spring.ai.embedding.transformer.tokenizer.options.padToMultipleOf=8application.yaml:
spring:
ai:
embedding:
transformer:
tokenizer:
uri: classpath:/tokenizers/custom-tokenizer.json
options:
addSpecialTokens: "true"
modelMaxLength: "512"
truncation: "true"
padding: "true"
maxLength: "512"
stride: "128"
padToMultipleOf: "8"Common Tokenizer Options:
# addSpecialTokens: Add CLS, SEP tokens
# Values: "true" | "false"
# Default: tokenizer's built-in default
spring.ai.embedding.transformer.tokenizer.options.addSpecialTokens=true
# modelMaxLength: Maximum sequence length
# Values: numeric string (e.g., "512", "1024")
# Default: tokenizer's built-in default
spring.ai.embedding.transformer.tokenizer.options.modelMaxLength=512
# truncation: Truncate sequences exceeding max length
# Values: "true" | "false"
# Default: tokenizer's built-in default
spring.ai.embedding.transformer.tokenizer.options.truncation=true
# padding: Pad short sequences
# Values: "true" | "false" | "max_length" | "longest"
# Default: tokenizer's built-in default
spring.ai.embedding.transformer.tokenizer.options.padding=max_length
# maxLength: Explicit max length for padding/truncation
# Values: numeric string
# Default: derived from modelMaxLength
spring.ai.embedding.transformer.tokenizer.options.maxLength=512
# stride: Stride for sliding window tokenization
# Values: numeric string
# Default: 0 (no stride)
spring.ai.embedding.transformer.tokenizer.options.stride=128
# padToMultipleOf: Round padding length to multiple
# Values: numeric string (typically 8 for hardware optimization)
# Default: no rounding
spring.ai.embedding.transformer.tokenizer.options.padToMultipleOf=8Configuration Examples:
# Example 1: Strict truncation (for consistent embedding size)
spring.ai.embedding.transformer.tokenizer.options.truncation=true
spring.ai.embedding.transformer.tokenizer.options.maxLength=256
spring.ai.embedding.transformer.tokenizer.options.padding=max_length
# Example 2: No special tokens (for custom models)
spring.ai.embedding.transformer.tokenizer.options.addSpecialTokens=false
# Example 3: Sliding window with stride
spring.ai.embedding.transformer.tokenizer.options.maxLength=512
spring.ai.embedding.transformer.tokenizer.options.stride=256
spring.ai.embedding.transformer.tokenizer.options.truncation=true
# Example 4: Hardware-optimized padding
spring.ai.embedding.transformer.tokenizer.options.padding=true
spring.ai.embedding.transformer.tokenizer.options.padToMultipleOf=8Edge Cases:
# Invalid boolean value - behavior depends on tokenizer
spring.ai.embedding.transformer.tokenizer.options.truncation=invalid
# May be ignored or cause error during initialization
# Non-numeric value for numeric option
spring.ai.embedding.transformer.tokenizer.options.maxLength=abc
# Likely causes error during initialization
# Conflicting options - last one wins (in properties file)
spring.ai.embedding.transformer.tokenizer.options.padding=true
spring.ai.embedding.transformer.tokenizer.options.padding=false
# Result: false (properties file loads sequentially)
# Empty option value
spring.ai.embedding.transformer.tokenizer.options.truncation=
# May be ignored or treated as false
# Case sensitivity
spring.ai.embedding.transformer.tokenizer.options.Truncation=true # Wrong case
# Option ignored (correct: truncation with lowercase 't')Control resource caching behavior for models and tokenizers.
/**
* Controls caching of remote, large resources to local file system.
*/
public static class Cache {
/**
* Enable the Resource caching.
*/
private boolean enabled = true;
/**
* Resource cache directory. Used to cache remote resources, such as the ONNX
* models, to the local file system. Applicable only for cache.enabled == true.
* Defaults to {java.io.tmpdir}/spring-ai-onnx-generative.
*/
private String directory = DEFAULT_CACHE_DIRECTORY;
public boolean isEnabled();
public void setEnabled(boolean enabled);
public String getDirectory();
public void setDirectory(String directory);
}application.properties:
# Enable/disable caching
spring.ai.embedding.transformer.cache.enabled=true
# Default: true
# Cache directory location
spring.ai.embedding.transformer.cache.directory=/var/cache/spring-ai-models
# Default: {java.io.tmpdir}/spring-ai-onnx-generative
# Using environment variables
spring.ai.embedding.transformer.cache.directory=${CACHE_DIR:/var/cache/models}
# Using user home directory
spring.ai.embedding.transformer.cache.directory=${user.home}/.spring-ai/cache
# Using relative path (relative to working directory)
spring.ai.embedding.transformer.cache.directory=./cacheapplication.yaml:
spring:
ai:
embedding:
transformer:
cache:
enabled: true
directory: /var/cache/spring-ai-modelsDefault Enabled: true (caching enabled)
Default Directory: {java.io.tmpdir}/spring-ai-onnx-generative
Environment-Specific Configuration:
# application-dev.properties
spring.ai.embedding.transformer.cache.enabled=false # Disable for development
spring.ai.embedding.transformer.cache.directory=./dev-cache
# application-test.properties
spring.ai.embedding.transformer.cache.enabled=true
spring.ai.embedding.transformer.cache.directory=${java.io.tmpdir}/test-cache
# application-prod.properties
spring.ai.embedding.transformer.cache.enabled=true
spring.ai.embedding.transformer.cache.directory=/var/cache/spring-ai-modelsUse Cases:
# Development: Disable caching for frequently changing models
spring.ai.embedding.transformer.cache.enabled=false
# Production: Enable with persistent directory
spring.ai.embedding.transformer.cache.enabled=true
spring.ai.embedding.transformer.cache.directory=/persistent/cache
# Testing: Enable with temporary directory
spring.ai.embedding.transformer.cache.enabled=true
spring.ai.embedding.transformer.cache.directory=${java.io.tmpdir}/test-cache
# Containerized: Use volume-mounted directory
spring.ai.embedding.transformer.cache.enabled=true
spring.ai.embedding.transformer.cache.directory=/mnt/cacheEdge Cases:
# Directory with no write permissions - fails during initialization
spring.ai.embedding.transformer.cache.directory=/root/cache
# Error: Permission denied
# Directory on full disk - fails during model download
spring.ai.embedding.transformer.cache.directory=/full/disk/cache
# Error: No space left on device
# Very long path - may fail on some filesystems
spring.ai.embedding.transformer.cache.directory=/very/long/path/...
# Windows max path: 260 characters
# Network-mounted directory - works but slower
spring.ai.embedding.transformer.cache.directory=/mnt/nfs/cache
# Higher latency but shared across instances
# Disable caching but specify directory - directory ignored
spring.ai.embedding.transformer.cache.enabled=false
spring.ai.embedding.transformer.cache.directory=/some/dir
# Directory setting has no effect when caching is disabledConfigure the ONNX model resource, output layer name, and GPU settings.
/**
* ONNX model configuration.
*/
public static class Onnx {
/**
* Existing, pre-trained ONNX generative. Commonly exported from
* https://sbert.net/docs/pretrained_models.html. Defaults to
* sentence-transformers/all-MiniLM-L6-v2.
*/
private String modelUri = TransformersEmbeddingModel.DEFAULT_ONNX_MODEL_URI;
/**
* Defaults to: 'last_hidden_state'.
*/
private String modelOutputName = TransformersEmbeddingModel.DEFAULT_MODEL_OUTPUT_NAME;
/**
* Run on a GPU or with another provider (optional).
* https://onnxruntime.ai/docs/get-started/with-java.html#run-on-a-gpu-or-with-another-provider-optional
*
* The GPU device ID to execute on. Only applicable if >= 0. Ignored otherwise.
*/
private int gpuDeviceId = -1;
public String getModelUri();
public void setModelUri(String modelUri);
public int getGpuDeviceId();
public void setGpuDeviceId(int gpuDeviceId);
public String getModelOutputName();
public void setModelOutputName(String modelOutputName);
}application.properties:
# ONNX model URI
spring.ai.embedding.transformer.onnx.model-uri=https://example.com/models/custom-bert.onnx
# Default: https://github.com/.../all-MiniLM-L6-v2/model.onnx
# From classpath
spring.ai.embedding.transformer.onnx.model-uri=classpath:/models/model.onnx
# From filesystem
spring.ai.embedding.transformer.onnx.model-uri=file:///path/to/model.onnx
# Using environment variable
spring.ai.embedding.transformer.onnx.model-uri=${MODEL_URI:classpath:/models/default.onnx}
# Model output tensor name
spring.ai.embedding.transformer.onnx.model-output-name=last_hidden_state
# Default: last_hidden_state
# GPU device ID
spring.ai.embedding.transformer.onnx.gpu-device-id=0
# Values: -1 (CPU), 0 (first GPU), 1 (second GPU), etc.
# Default: -1 (CPU)
# Using environment variable for GPU
spring.ai.embedding.transformer.onnx.gpu-device-id=${GPU_DEVICE_ID:-1}application.yaml:
spring:
ai:
embedding:
transformer:
onnx:
model-uri: https://example.com/models/custom-bert.onnx
model-output-name: last_hidden_state
gpu-device-id: 0 # -1 for CPU, 0+ for GPU device IDDefault Model URI: https://github.com/spring-projects/spring-ai/raw/main/models/spring-ai-transformers/src/main/resources/onnx/all-MiniLM-L6-v2/model.onnx
Default Output Name: last_hidden_state
Default GPU Device ID: -1 (CPU inference)
GPU Configuration Examples:
# CPU only (default)
spring.ai.embedding.transformer.onnx.gpu-device-id=-1
# First GPU
spring.ai.embedding.transformer.onnx.gpu-device-id=0
# Second GPU (multi-GPU system)
spring.ai.embedding.transformer.onnx.gpu-device-id=1
# Environment-based GPU selection
spring.ai.embedding.transformer.onnx.gpu-device-id=${CUDA_VISIBLE_DEVICES:0}
# Fallback to CPU if GPU unavailable (in properties - won't work, needs code)
# Better approach: handle in custom bean configurationModel Output Name Examples:
# BERT-based models
spring.ai.embedding.transformer.onnx.model-output-name=last_hidden_state # Token embeddings
spring.ai.embedding.transformer.onnx.model-output-name=pooler_output # CLS token
# Sentence-BERT models
spring.ai.embedding.transformer.onnx.model-output-name=sentence_embedding # Sentence-level
spring.ai.embedding.transformer.onnx.model-output-name=token_embeddings # Token-level
# Custom models - check with ONNX model inspector
spring.ai.embedding.transformer.onnx.model-output-name=embeddingsEdge Cases:
# Invalid GPU ID - fails during initialization
spring.ai.embedding.transformer.onnx.gpu-device-id=999
# Error: Invalid device ID or CUDA error
# Non-numeric GPU ID - fails to parse
spring.ai.embedding.transformer.onnx.gpu-device-id=gpu0
# Error: NumberFormatException
# Invalid model output name - fails during initialization
spring.ai.embedding.transformer.onnx.model-output-name=nonexistent
# Error: Output 'nonexistent' not found in model
# Empty model URI - uses default
spring.ai.embedding.transformer.onnx.model-uri=
# May use default or fail
# Invalid model URI - fails during initialization
spring.ai.embedding.transformer.onnx.model-uri=invalid://url
# Error: Unknown protocol or network errorProfile-Specific GPU Configuration:
# application-dev.properties
spring.ai.embedding.transformer.onnx.gpu-device-id=-1 # CPU for development
# application-test.properties
spring.ai.embedding.transformer.onnx.gpu-device-id=-1 # CPU for consistent tests
# application-prod.properties
spring.ai.embedding.transformer.onnx.gpu-device-id=0 # GPU for production# ========================================
# Spring AI Transformers Configuration
# ========================================
# Metadata handling
spring.ai.embedding.transformer.metadata-mode=NONE
# Tokenizer configuration
spring.ai.embedding.transformer.tokenizer.uri=classpath:/models/tokenizer.json
spring.ai.embedding.transformer.tokenizer.options.modelMaxLength=512
spring.ai.embedding.transformer.tokenizer.options.truncation=true
spring.ai.embedding.transformer.tokenizer.options.padding=max_length
spring.ai.embedding.transformer.tokenizer.options.addSpecialTokens=true
# Cache configuration
spring.ai.embedding.transformer.cache.enabled=true
spring.ai.embedding.transformer.cache.directory=/var/cache/spring-ai
# ONNX model configuration
spring.ai.embedding.transformer.onnx.model-uri=classpath:/models/custom-model.onnx
spring.ai.embedding.transformer.onnx.model-output-name=last_hidden_state
spring.ai.embedding.transformer.onnx.gpu-device-id=0spring:
ai:
embedding:
transformer:
# Metadata handling
metadata-mode: NONE
# Tokenizer configuration
tokenizer:
uri: classpath:/models/tokenizer.json
options:
modelMaxLength: "512"
truncation: "true"
padding: "max_length"
addSpecialTokens: "true"
# Cache configuration
cache:
enabled: true
directory: /var/cache/spring-ai
# ONNX model configuration
onnx:
model-uri: classpath:/models/custom-model.onnx
model-output-name: last_hidden_state
gpu-device-id: 0# ========================================
# application-dev.properties
# ========================================
spring.ai.embedding.transformer.onnx.gpu-device-id=-1
spring.ai.embedding.transformer.cache.enabled=false
spring.ai.embedding.transformer.onnx.model-uri=file:///local/dev/models/model.onnx
# ========================================
# application-test.properties
# ========================================
spring.ai.embedding.transformer.onnx.gpu-device-id=-1
spring.ai.embedding.transformer.cache.enabled=true
spring.ai.embedding.transformer.cache.directory=${java.io.tmpdir}/test-cache
spring.ai.embedding.transformer.onnx.model-uri=classpath:/test-models/model.onnx
# ========================================
# application-prod.properties
# ========================================
spring.ai.embedding.transformer.onnx.gpu-device-id=${GPU_DEVICE_ID:0}
spring.ai.embedding.transformer.cache.enabled=true
spring.ai.embedding.transformer.cache.directory=/var/cache/spring-ai-models
spring.ai.embedding.transformer.onnx.model-uri=${MODEL_URI:https://example.com/models/prod-model.onnx}apiVersion: v1
kind: ConfigMap
metadata:
name: embedding-config
data:
application.properties: |
spring.ai.embedding.transformer.onnx.model-uri=https://models.example.com/model.onnx
spring.ai.embedding.transformer.tokenizer.uri=https://models.example.com/tokenizer.json
spring.ai.embedding.transformer.cache.enabled=true
spring.ai.embedding.transformer.cache.directory=/cache
spring.ai.embedding.transformer.onnx.gpu-device-id=0# docker-compose.yml environment section
environment:
- SPRING_AI_EMBEDDING_TRANSFORMER_ONNX_GPUDEVICEID=0
- SPRING_AI_EMBEDDING_TRANSFORMER_CACHE_DIRECTORY=/cache
- SPRING_AI_EMBEDDING_TRANSFORMER_CACHE_ENABLED=true
- SPRING_AI_EMBEDDING_TRANSFORMER_ONNX_MODELURI=classpath:/models/model.onnxWith Spring Boot auto-configuration, the TransformersEmbeddingModel bean is created automatically. Simply inject it into your components:
import org.springframework.ai.transformers.TransformersEmbeddingModel;
import org.springframework.stereotype.Service;
@Service
public class EmbeddingService {
private final TransformersEmbeddingModel embeddingModel;
// Constructor injection (recommended)
public EmbeddingService(TransformersEmbeddingModel embeddingModel) {
this.embeddingModel = embeddingModel;
}
public float[] generateEmbedding(String text) {
// Model is already initialized by Spring Boot
return embeddingModel.embed(text);
}
}Key Points:
afterPropertiesSet() - Spring Boot handles initializationVerifying Configuration:
@Component
public class ConfigurationLogger implements CommandLineRunner {
private final TransformersEmbeddingModel model;
public ConfigurationLogger(TransformersEmbeddingModel model) {
this.model = model;
}
@Override
public void run(String... args) {
System.out.println("Embedding dimensions: " + model.dimensions());
// Verify model is configured correctly
}
}Auto-configuration only activates when the TransformersEmbeddingModel class is on the classpath. To disable auto-configuration:
# Option 1: Exclude auto-configuration class
spring.autoconfigure.exclude=org.springframework.ai.model.transformers.autoconfigure.TransformersEmbeddingModelAutoConfiguration
# Option 2: Set property to different value
spring.ai.embedding.model=openai
# (any value other than "transformers" disables auto-configuration)import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.ai.model.transformers.autoconfigure.TransformersEmbeddingModelAutoConfiguration;
@SpringBootApplication(exclude = {
TransformersEmbeddingModelAutoConfiguration.class
})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}package org.springframework.ai.model.transformers.autoconfigure;
@ConfigurationProperties(TransformersEmbeddingModelProperties.CONFIG_PREFIX)
public class TransformersEmbeddingModelProperties {
public static final String CONFIG_PREFIX = "spring.ai.embedding.transformer";
public static final String DEFAULT_CACHE_DIRECTORY =
new File(System.getProperty("java.io.tmpdir"), "spring-ai-onnx-generative")
.getAbsolutePath();
private final Tokenizer tokenizer = new Tokenizer();
private final Cache cache = new Cache();
private final Onnx onnx = new Onnx();
private MetadataMode metadataMode = MetadataMode.NONE;
public Cache getCache();
public Onnx getOnnx();
public Tokenizer getTokenizer();
public MetadataMode getMetadataMode();
public void setMetadataMode(MetadataMode metadataMode);
}public static class Tokenizer {
private String uri = TransformersEmbeddingModel.DEFAULT_ONNX_TOKENIZER_URI;
private final Map<String, String> options = new HashMap<>();
public String getUri();
public void setUri(String uri);
public Map<String, String> getOptions();
}public static class Cache {
private boolean enabled = true;
private String directory = DEFAULT_CACHE_DIRECTORY;
public boolean isEnabled();
public void setEnabled(boolean enabled);
public String getDirectory();
public void setDirectory(String directory);
}public static class Onnx {
private String modelUri = TransformersEmbeddingModel.DEFAULT_ONNX_MODEL_URI;
private String modelOutputName = TransformersEmbeddingModel.DEFAULT_MODEL_OUTPUT_NAME;
private int gpuDeviceId = -1;
public String getModelUri();
public void setModelUri(String modelUri);
public int getGpuDeviceId();
public void setGpuDeviceId(int gpuDeviceId);
public String getModelOutputName();
public void setModelOutputName(String modelOutputName);
}/**
* Annotation for binding external configuration to a bean.
*/
@ConfigurationProperties
public @interface ConfigurationProperties {
/**
* The prefix of the properties to bind.
*/
String value() default "";
/**
* Same as value(), alternative syntax.
*/
String prefix() default "";
}Configuration properties can be set in multiple ways with the following precedence (highest to lowest):
1. Command-line arguments (highest priority)
--spring.ai.embedding.transformer.onnx.gpu-device-id=0
2. Java System properties
-Dspring.ai.embedding.transformer.onnx.gpu-device-id=0
3. OS environment variables
SPRING_AI_EMBEDDING_TRANSFORMER_ONNX_GPUDEVICEID=0
4. Profile-specific properties (application-{profile}.properties)
application-prod.properties
5. application.properties in current directory
./application.properties
6. application.properties in classpath
src/main/resources/application.properties
7. Default values in properties class (lowest priority)
Default values defined in codeExample:
# Command-line overrides all
java -jar app.jar \
--spring.ai.embedding.transformer.onnx.gpu-device-id=1 \
--spring.profiles.active=prod
# Even if application-prod.properties has:
# spring.ai.embedding.transformer.onnx.gpu-device-id=0
# The command-line value (1) takes precedenceEnvironment Variable Naming:
# Properties use dot notation
spring.ai.embedding.transformer.onnx.gpu-device-id=0
# Environment variables use uppercase with underscores
SPRING_AI_EMBEDDING_TRANSFORMER_ONNX_GPUDEVICEID=0
# Conversion rules:
# - Replace dots (.) with underscores (_)
# - Convert to uppercase
# - Remove hyphens (-) and convert next letter to uppercaseSpring Boot validates configuration properties at startup:
# Invalid integer value
spring.ai.embedding.transformer.onnx.gpu-device-id=invalid
# Error: Failed to bind properties
# Reason: Failed to convert property value of type 'java.lang.String' to required type 'int'# Invalid enum value
spring.ai.embedding.transformer.metadata-mode=INVALID
# Error: Failed to bind properties
# Reason: No enum constant MetadataMode.INVALID// No required properties - all have defaults
// Application starts even with no configuration@Configuration
@Validated
public class CustomValidationConfig {
@Bean
@ConditionalOnProperty("spring.ai.embedding.transformer.onnx.gpu-device-id")
public void validateGpuId(@Value("${spring.ai.embedding.transformer.onnx.gpu-device-id}") int gpuId) {
if (gpuId < -1) {
throw new IllegalArgumentException("GPU device ID must be >= -1");
}
if (gpuId > 7) {
// Assume max 8 GPUs
throw new IllegalArgumentException("GPU device ID must be <= 7");
}
}
}# Invalid metadata mode (must be NONE, EMBED, or ALL)
spring.ai.embedding.transformer.metadata-mode=none
# Error: No enum constant MetadataMode.none (case-sensitive)
# Invalid GPU device ID format
spring.ai.embedding.transformer.onnx.gpu-device-id=gpu0
# Error: NumberFormatException
# Cache directory creation failure
spring.ai.embedding.transformer.cache.directory=/root/cache
# Error during initialization: Permission denied
# Model/tokenizer resource not found
spring.ai.embedding.transformer.onnx.model-uri=classpath:/nonexistent.onnx
# Error during initialization: Resource not foundProblem: Configuration changes don't apply
Solutions:
# 1. Verify property file is loaded
java -jar app.jar --spring.config.location=file:./application.properties
# 2. Check active profiles
java -jar app.jar --spring.profiles.active=prod
# 3. Enable debug logging
java -jar app.jar --debug --logging.level.org.springframework.boot=DEBUG
# 4. Verify property names (case-sensitive, exact match)
# Wrong:
spring.ai.embedding.transformer.onnx.gpuDeviceId=0
# Correct:
spring.ai.embedding.transformer.onnx.gpu-device-id=0Problem: Unexpected property values
Solution: Check precedence chain
# List all properties with precedence
java -jar app.jar --debug 2>&1 | grep "spring.ai.embedding"Problem: Environment variables not working
Solutions:
# Check environment variable is set
echo $SPRING_AI_EMBEDDING_TRANSFORMER_ONNX_GPUDEVICEID
# Verify naming conversion
# Property: spring.ai.embedding.transformer.onnx.gpu-device-id
# Env var: SPRING_AI_EMBEDDING_TRANSFORMER_ONNX_GPUDEVICEID
# (no hyphen, uppercase, underscores)
# Set environment variable correctly
export SPRING_AI_EMBEDDING_TRANSFORMER_ONNX_GPUDEVICEID=0Problem: Profile-specific properties ignored
Solutions:
# Activate profile explicitly
java -jar app.jar --spring.profiles.active=prod
# Check profile-specific file exists
# application-prod.properties (in classpath or current directory)
# Verify file naming
# Correct: application-prod.properties
# Wrong: application.prod.propertiesProblem: Application fails to start after configuration change
Solutions:
# 1. Revert to defaults
# Remove all custom properties and test
# 2. Enable debug mode
debug=true
logging.level.org.springframework.boot.autoconfigure=DEBUG
# 3. Check specific error messages
# Model loading errors
spring.ai.embedding.transformer.onnx.model-uri=classpath:/models/model.onnx
# GPU initialization errors
spring.ai.embedding.transformer.onnx.gpu-device-id=-1 # Fallback to CPU
# Cache directory errors
spring.ai.embedding.transformer.cache.directory=${user.home}/.spring-ai/cache# Use environment variables for deployment-specific values
spring.ai.embedding.transformer.onnx.gpu-device-id=${GPU_DEVICE_ID:0}
spring.ai.embedding.transformer.cache.directory=${CACHE_DIR:/var/cache}# Base configuration: application.properties
spring.ai.embedding.transformer.cache.enabled=true
# Dev: application-dev.properties
spring.ai.embedding.transformer.onnx.gpu-device-id=-1
spring.ai.embedding.transformer.cache.directory=./cache
# Prod: application-prod.properties
spring.ai.embedding.transformer.onnx.gpu-device-id=0
spring.ai.embedding.transformer.cache.directory=/var/cache/models# ========================================
# Embedding Model Configuration
# ========================================
# GPU Device: 0 = first GPU, -1 = CPU
spring.ai.embedding.transformer.onnx.gpu-device-id=0
# Cache Location: Persistent storage for production
spring.ai.embedding.transformer.cache.directory=/var/cache/spring-ai@Component
public class ConfigurationValidator implements CommandLineRunner {
@Value("${spring.ai.embedding.transformer.onnx.gpu-device-id}")
private int gpuDeviceId;
@Value("${spring.ai.embedding.transformer.cache.directory}")
private String cacheDir;
@Override
public void run(String... args) {
// Log configuration
System.out.println("GPU Device ID: " + gpuDeviceId);
System.out.println("Cache Directory: " + cacheDir);
// Validate cache directory exists and is writable
File cacheDirFile = new File(cacheDir);
if (!cacheDirFile.exists() || !cacheDirFile.canWrite()) {
throw new IllegalStateException("Cache directory not writable: " + cacheDir);
}
}
}<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>Benefit: IDE autocomplete for property names
tessl i tessl/maven-org-springframework-ai--spring-ai-transformers@1.1.1