L'éditeur PHP Xigua vous amènera à approfondir la question du chargement des listes d'objets dans l'application yml en Java. Dans Java Spring Boot, en configurant correctement le fichier yml, vous pouvez charger la liste d'objets et l'appliquer de manière flexible dans l'application. Ensuite, maîtrisons ensemble cette technique pour améliorer la praticité et l'efficacité du développement de Spring Boot.
Contenu de la question
J'ai cette classe de configuration :
1 2 3 4 5 6 7 8 | @configuration
@configurationproperties(prefix = "house" )
public class projectconfig{
private list<housetemplate> templates;
}
|
Copier après la connexion
classe de modèle de maison :
1 2 3 4 5 6 7 | public class housetemplate{
private string id;
private string description;
}
|
Copier après la connexion
Voici mon application-test.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | house:
templates:
-
id: "colonial"
description: "colonial house template"
-
id: "cottage"
description: "cottage house template"
-
id: "apartment"
description: "apartment house template"
examplestring: hello
|
Copier après la connexion
Dans ma classe de test, j'ai les éléments suivants :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | @runwith(springrunner. class )
@enableconfigurationproperties(value = projectconfig. class )
@testpropertysource( "classpath:application-test.yml" )
public class yamlapplicationcontextloadingspec {
@value( "${examplestring}" )
string example;
@autowired
projectconfig projectconfig;
@test
public void exampleshouldcontainhello(){
assertthat(example).isequaltoignoringcase( "hello" );
}
@test
public void appcontextcontainshousetemplates(){
list<housetemplate> housetemplates = projectconfig.gettemplates();
assertthat(housetemplates).isnotnull();
}
}
|
Copier après la connexion
Le premier test pour examplestring réussit, mais le deuxième test échoue. Pourquoi ne puis-je pas mapper yml dans la liste des modèles maison ?
Modifier
1 2 3 4 5 6 7 8 | <artifactId>spring-core</artifactId>
<version>4.3.6.RELEASE</version>
<artifactId>spring-boot</artifactId>
<version>1.5.1.RELEASE</version>
<artifactId>junit</artifactId>
<version>4.12</version>
|
Copier après la connexion
Je sais qu'ils sont vraiment vieux et j'aimerais les mettre à niveau, mais je ne peux pas... c'est à cela que je dois faire face.
Solution
Utilisez @configurationproperties
从yml中读取后,可以将其注册为bean,然后可以通过applicationcontext
pour l'obtenir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | @configuration
@configurationproperties(prefix = "house" )
public class testconfig {
private list<housetemplate> templates;
@bean
public list<housetemplate> templates() {
return templates;
}
}
@restcontroller
@requestmapping( "/api/test" )
public class testcontroller {
@autowired
private applicationcontext applicationcontext;
@getmapping( "get" )
@suppresswarnings( "unchecked" )
public list<housetemplate> get() {
return (list<housetemplate>) applicationcontext.getbean( "templates" );
}
}
|
Copier après la connexion
Si vous ne souhaitez pas vous inscrire en tant que bean, vous pouvez également déclarer la variable comme statique.
Voici un exemple.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | @Configuration
@ConfigurationProperties(prefix = "House" )
public class TestConfig {
private static List<HouseTemplate> templates;
public static List<HouseTemplate> get() {
return templates;
}
public List<HouseTemplate> getTemplates() {
return templates;
}
public void setTemplates(List<HouseTemplate> templates) {
TestConfig.templates = templates;
}
}
@RestController
@RequestMapping( "/api/test" )
public class TestController {
@GetMapping( "get" )
public List<HouseTemplate> get() {
return TestConfig.get();
}
}
|
Copier après la connexion
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!