En guide til Spring Boot Configuration Metadata

1. Oversikt

Når du skriver et Spring Boot-program, er det nyttig å kartlegge konfigurasjonsegenskaper på Java-bønner. Hva er den beste måten å dokumentere disse egenskapene på?

I denne opplæringen vil vi utforske Spring Boot Configuration Processor og tilhørende JSON-metadatafiler som dokumenterer hver eiendoms betydning, begrensninger og så videre.

2. Konfigurasjonsmetadata

De fleste applikasjonene vi jobber med som utviklere må være konfigurerbare til en viss grad. Imidlertid forstår vi vanligvis ikke egentlig hva en konfigurasjonsparameter gjør, hvis den har en standardverdi, hvis den er utfaset, og til tider vet vi ikke engang at eiendommen eksisterer.

For å hjelpe oss, genererer Spring Boot konfigurasjonsmetadata i en JSON-fil, som gir oss nyttig informasjon om hvordan du bruker egenskapene. Så, konfigurasjonsmetadataene er en beskrivende fil som inneholder nødvendig informasjon for interaksjon med konfigurasjonsegenskapene.

Det veldig fine med denne filen er at IDEer kan også lese den, som gir oss autofullføring av Spring-egenskaper, så vel som andre konfigurasjonstips.

3. Avhengigheter

For å generere disse konfigurasjonsmetadataene, bruker vi konfigurasjonsprosessoren fra spring-boot-configuration-prosessor avhengighet.

Så la oss fortsette og legge til avhengigheten som valgfri:

 org.springframework.boot spring-boot-configuration-processor 2.1.6.RELEASE true 

Denne avhengigheten vil gi oss en Java-merkeprosessor påberopt når vi bygger prosjektet vårt. Vi snakker i detalj om dette senere.

Det er en god praksis å legge til en avhengighet som valgfri i Maven for å forhindre @ConfigurationProperties fra å bli brukt på andre moduler som prosjektet vårt bruker.

4. Konfigurasjonsegenskaper Eksempel

For å se prosessoren i aksjon, la oss forestille oss at vi har noen få egenskaper som vi må inkludere i vår Spring Boot-applikasjon via en Java-bønne:

@Configuration @ConfigurationProperties (prefix = "database") public class DatabaseProperties {public static class Server {private String ip; privat int port; // standard getters and setters} private String brukernavn; privat strengpassord; privat server server; // standard getters og setters}

For å gjøre dette bruker vi @ConfigurationProperties kommentar. Konfigurasjonsprosessoren søker etter klasser og metoder med denne kommentaren for å få tilgang til konfigurasjonsparametrene og generere konfigurasjonsmetadata.

La oss legge til et par av disse egenskapene i en eiendomsfil. I dette tilfellet vil vi kalle det databaseproperties-test.properties:

#Simple Properties database.username = baeldung database.password = passord

Og for å være sikker vil vi også legge til en test for å sikre at vi alle er oppstilt:

@RunWith (SpringRunner.class) @SpringBootTest (klasser = AnnotationProcessorApplication.class) @TestPropertySource ("classpath: databaseproperties-test.properties") public class DatabasePropertiesIntegrationTest {@Autowired private DatabaseProperties database; @Test offentlig ugyldig nårSimplePropertyQueriedThenReturnsPropertyValue () kaster unntak {Assert.assertEquals ("Feil bundet brukernavnegenskap", "baeldung", databaseProperties.getUsername ()); Assert.assertEquals ("Feil bundet passordegenskap", "passord", databaseProperties.getPassword ()); }}

Vi har også lagt til de nestede eiendommene database.server.id og database.server.port via indre klasse Server. Vi bør legge til den indre klassen Server så vel som et felt server med sin egen getter og setter.

La oss i vår test gjøre en rask sjekk for å sikre at vi også kan angi og lese vellykkede nestede egenskaper:

@Test offentlig ugyldig nårNestedPropertyQueriedThenReturnsPropertyValue () kaster unntak {Assert.assertEquals ("Feil bundet server IP-nestet eiendom", "127.0.0.1", databaseProperties.getServer (). GetIp ()); Assert.assertEquals ("Feil bundet Server Port nestet eiendom", 3306, databaseProperties.getServer (). GetPort ()); }

Ok, nå er vi klare til å bruke prosessoren.

5. Genererer konfigurasjonsmetadata

Vi nevnte tidligere at konfigurasjonsprosessoren genererer en fil - den bruker denne kommentarbehandlingen.

Så, etter å ha samlet prosjektet vårt, får vi se a fil kalt spring-configuration-metadata.json innsiden mål / klasser / META-INF:

{"grupper": [{"name": "database", "type": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties", "sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties"}, {" navn ":" database.server "," type ":" com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties $ Server "," sourceType ":" com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties "," sourceMethod ":" getServer ( ) "}]," egenskaper ": [{" name ":" database.password "," type ":" java.lang.String "," sourceType ":" com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties "}, {"name": "database.server.ip", "type": "java.lang.String", "sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties $ Server"}, {"name": " database.server.port "," type ":" java.lang.Integer "," sourceType ":" com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties $ Server "," defaultValue ": 0}, {" name ":" database.username "," type ":" java.lang.String " , "sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties"}], "hints": []}

Deretter, la oss se hvordan endrede merknader på Java-bønner påvirker metadataene.

5.1. Tilleggsinformasjon om konfigurasjonsmetadata

La oss først legge til JavaDoc-kommentarer på Server.

For det andre, la oss gi en standardverdi til database.server.port feltet og til slutt legge til @Min og @Max kommentarer:

offentlig statisk klasse Server {/ ** * IP til databaseserveren * / privat streng ip; / ** * Porten til databaseserveren. * Standardverdien er 443. * De tillatte verdiene er i området 400-4000. * / @Min (400) @Max (800) privat int port = 443; // standard getters og setters}

Hvis vi sjekker spring-configuration-metadata.json fil nå, vil vi se denne ekstra informasjonen gjenspeiles:

{"grupper": [{"name": "database", "type": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties", "sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties"}, {" navn ":" database.server "," type ":" com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties $ Server "," sourceType ":" com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties "," sourceMethod ":" getServer ( ) "}]," egenskaper ": [{" name ":" database.password "," type ":" java.lang.String "," sourceType ":" com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties "}, {"name": "database.server.ip", "type": "java.lang.String", "description": "IP-adressen til databaseserveren", "sourceType": "com.baeldung.autoconfiguration.annotationprocessor .DatabaseProperties $ Server "}, {" name ":" database.server.port "," type ":" java.lang.Integer "," description ":" Porten til databaseserveren. Standardverdien er 443. De tillatte verdiene er i området 400-4000 "," s ourceType ":" com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties $ Server "," defaultValue ": 443}, {" name ":" database.username "," type ":" java.lang.String "," sourceType " : "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties"}], "hints": []}

Vi kan sjekke forskjellene med database.server.ip og database.server.port Enger. Faktisk er den ekstra informasjonen ganske nyttig. Som et resultat er det mye lettere for utviklere og IDEer å forstå hva hver eiendom gjør.

Vi bør også sørge for at vi utløser build for å få den oppdaterte filen. I Eclipse, hvis vi sjekker Bygg automatisk alternativ, vil hver lagringshandling utløse en build. I IntelliJ bør vi utløse bygningen manuelt.

5.2. Forstå metadataformatet

La oss se nærmere på JSON-metadatafilen og diskutere komponentene.

Grupper er elementer på høyere nivå som brukes til å gruppere andre egenskaper, uten å spesifisere en verdi selv. I vårt eksempel har vi database gruppe, som også er prefikset til konfigurasjonsegenskapene. Vi har også en server gruppe, som vi opprettet via en indre klasse og grupper ip og havn eiendommer.

Eiendommer er konfigurasjonselementer som vi kan spesifisere en verdi for. Disse egenskapene er angitt i .eiendommer eller .yml filer og kan ha ekstra informasjon, som standardverdier og valideringer, som vi så i eksemplet ovenfor.

Tips er tilleggsinformasjon som hjelper brukeren med å angi eiendomsverdien. For eksempel, hvis vi har et sett med tillatt verdi for en eiendom, kan vi gi en beskrivelse av hva hver av dem gjør. IDE vil gi autokonkurransehjelp for disse tipsene.

Hver komponent i konfigurasjonsmetadataene har sine egne attributter for å forklare konfigurasjonsegenskapene i finere detaljer.

6. Konklusjon

I denne artikkelen så vi på Spring Boot Configuration Processor og dens evne til å lage konfigurasjonsmetadata. Ved å bruke disse metadataene blir det mye enklere å samhandle med konfigurasjonsparametrene våre.

Vi ga et eksempel på genererte konfigurasjonsmetadata og forklarte i detalj format og komponenter.

Vi så også hvor nyttig autofullføringsstøtten på vår IDE kan være.

Som alltid kan alle kodebitene som er nevnt i denne artikkelen finnes på GitHub-depotet vårt.


$config[zx-auto] not found$config[zx-overlay] not found