diff --git a/.gitignore b/.gitignore index cd4f7a7..ba75d8d 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,6 @@ build/ .vscode/ /logs/ + +# Maven shade plugin generated files +dependency-reduced-pom.xml diff --git a/mi-sql-public-demo/src/main/java/com/example/MainSQL.java b/mi-sql-public-demo/src/main/java/com/example/MainSQL.java index bedc095..41b6748 100644 --- a/mi-sql-public-demo/src/main/java/com/example/MainSQL.java +++ b/mi-sql-public-demo/src/main/java/com/example/MainSQL.java @@ -4,6 +4,8 @@ import java.io.IOException; import java.io.InputStream; import java.util.Properties; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.sql.*; @@ -11,6 +13,33 @@ public class MainSQL { + /** + * Simple placeholder resolver for ${VAR_NAME} and ${VAR_NAME:default} patterns + */ + private static String resolvePlaceholders(String input) { + if (input == null) return null; + + Pattern pattern = Pattern.compile("\\$\\{([^}:]+)(?::([^}]*))?\\}"); + Matcher matcher = pattern.matcher(input); + StringBuffer result = new StringBuffer(); + + while (matcher.find()) { + String varName = matcher.group(1); + String defaultValue = matcher.group(2); + String envValue = System.getenv(varName); + + if (envValue != null) { + matcher.appendReplacement(result, Matcher.quoteReplacement(envValue)); + } else if (defaultValue != null) { + matcher.appendReplacement(result, Matcher.quoteReplacement(defaultValue)); + } else { + // Leave placeholder unresolved + matcher.appendReplacement(result, Matcher.quoteReplacement(matcher.group(0))); + } + } + matcher.appendTail(result); + return result.toString(); + } public static void main(String[] args) { @@ -30,10 +59,29 @@ public static void main(String[] args) { String connString = properties.getProperty("spring.datasource.url"); if (connString == null) { - System.out.println("spring.datasource.url property not found in application.properties"); + System.out.println("ERROR: spring.datasource.url property not found in application.properties"); + return; + } + + // Resolve environment variable placeholders + connString = resolvePlaceholders(connString); + + // Check for unresolved placeholders + if (connString.contains("${AZ_DATABASE_SERVER_NAME}")) { + System.out.println("ERROR: AZ_DATABASE_SERVER_NAME environment variable is not set"); + System.out.println("Please set the AZ_DATABASE_SERVER_NAME environment variable to your Azure SQL server name"); return; } + String clientId = properties.getProperty("spring.cloud.azure.credential.client-id"); + if (clientId != null) { + clientId = resolvePlaceholders(clientId); + if (clientId.contains("${AZURE_CLIENT_ID}")) { + System.out.println("WARNING: AZURE_CLIENT_ID environment variable is not set"); + System.out.println("This is required for user-assigned managed identity, but optional for system-assigned managed identity"); + } + } + System.out.println("Connection string: " + connString); SQLServerDataSource ds = new SQLServerDataSource(); diff --git a/mi-sql-public-demo/src/main/resources/application.properties b/mi-sql-public-demo/src/main/resources/application.properties index ecef929..4301aa0 100644 --- a/mi-sql-public-demo/src/main/resources/application.properties +++ b/mi-sql-public-demo/src/main/resources/application.properties @@ -1,6 +1,6 @@ # Azure SQL Database configuration with Managed Identity -spring.datasource.url=jdbc:sqlserver://${AZ_DATABASE_SERVER_NAME}.database.windows.net:1433;database=demo;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;authentication=ActiveDirectoryMSI +spring.datasource.url=jdbc:sqlserver://${AZ_DATABASE_SERVER_NAME}.database.windows.net:1433;database=${AZ_DATABASE_NAME:demo};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;authentication=ActiveDirectoryMSI # Azure Managed Identity configuration spring.cloud.azure.credential.managed-identity-enabled=true -spring.cloud.azure.credential.client-id= \ No newline at end of file +spring.cloud.azure.credential.client-id=${AZURE_CLIENT_ID} \ No newline at end of file