Skip to content

Instantly share code, notes, and snippets.

@kishida
Created August 16, 2025 05:07
Show Gist options
  • Save kishida/b2815a7095fdcc0a17864bb4c5f9c5db to your computer and use it in GitHub Desktop.
Save kishida/b2815a7095fdcc0a17864bb4c5f9c5db to your computer and use it in GitHub Desktop.
Spring Boot Initializr Config Reader
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.Map;
@JsonIgnoreProperties(ignoreUnknown = true)
public record SpringConf(
Configuration configuration,
Dependencies dependencies,
Type types,
Selection bootVersions,
Selection packagings,
Selection javaVersions,
Selection languages,
Selection configurationFileFormats,
Value name,
Value description,
Value groupId,
Value artifactId,
Value version,
Value packageName
) {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
var client = HttpClient.newHttpClient();
var req = HttpRequest.newBuilder()
.uri(URI.create("https://start.spring.io/metadata/config"))
.GET()
.build();
var isRes = client.send(req, HttpResponse.BodyHandlers.ofInputStream());
var is = isRes.body();
var conf = mapper.readValue(is, SpringConf.class);
System.out.println("Artifact Repository: " + conf.configuration().env().artifactRepository());
System.out.println("BOM Keys: " + conf.configuration().env().boms().keySet());
conf.dependencies().content().stream()
.forEach(group -> System.out.println("%s %d deps".formatted(group.name(), group.content().size())));
System.out.println("%s %s".formatted(conf.types().getDefault().name(), conf.types().getDefault().action()));
System.out.println("%s %s %s %s %s".formatted(
conf.bootVersions().getDefault(),
conf.packagings().getDefault(),
conf.javaVersions().getDefault(),
conf.languages().getDefault(),
conf.configurationFileFormats().getDefault()));
System.out.println("%s %s\n %s %s %s %s".formatted(conf.name(), conf.description(),
conf.groupId(), conf.artifactId(), conf.version(), conf.packageName()));
}
@JsonIgnoreProperties(ignoreUnknown = true)
public record Configuration(
Env env
) {}
@JsonIgnoreProperties(ignoreUnknown = true)
public record Env(
String artifactRepository,
String springBootMetadataUrl,
String googleAnalyticsTrackingCode,
String fallbackApplicationName,
List<String> invalidApplicationNames,
List<String> invalidPackageNames,
boolean forceSsl,
Map<String, Bom> boms
) {}
@JsonIgnoreProperties(ignoreUnknown = true)
public record Bom(
String groupId,
String artifactId,
String versionProperty,
List<Mapping> mappings
) {}
@JsonIgnoreProperties(ignoreUnknown = true)
public record Mapping(
String compatibilityRange,
String groupId,
String artifactId,
String version,
boolean starter,
String bom, String repository
) {}
public record Dependencies(String id, String type, String title, String description, List<DependencyGroup> content) {}
public record DependencyGroup(String name, List<Dependency> content) {}
public record DependencyLink(
String rel, String href, String description, boolean templated) {}
@JsonIgnoreProperties(ignoreUnknown = true)
public record Dependency(
String name, String id, String groupId, String artifactId, String version, String scope, String description,
boolean starter, List<DependencyLink> links,
List<String> facets, List<String> aliases,
String compatibilityRange, String bom, List<Mapping> mappings) {}
public record TypeItem(String name, String id, String description, String action, Map<String, String> tags,
@JsonProperty("default") boolean def) {
@Override
public String toString() {
return name();
}
}
public record Type(String id, String type, String title, String description,
List<TypeItem> content) {
public TypeItem getDefault() {
return content.stream().filter(TypeItem::def).findFirst().get();
}
}
public record SelectionItem(String name, String id,
@JsonProperty("default") boolean def) {
@Override
public String toString() {
return name();
}
}
public record Selection(String id, String type, String title, String description,
List<SelectionItem> content) {
public SelectionItem getDefault() {
return content.stream().filter(SelectionItem::def).findFirst().get();
}
}
public record Value(
String id,
String type,
String title,
String description,
String content) {
@Override
public String toString() {
return content;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment