在SpringBoot中要引入yml配置文件中的数组,用常用的@Value是不可取的,我们必须另寻途径。详见以下代码:
配置文件,其中mqtt是一个对象,urls是一个字符串数组,mappings是一个对象数组
mqtt: urls: - tcp://120.24.75.149:1883 clientId: mqtt-gateway completionTimeout: 5000 router: mappings: - topicFilter: msg service: sensors - topicFilter: people service: people
配置代码:
import cn.webfuse.valuedemo.configuration.properties.Mappings; import cn.webfuse.valuedemo.configuration.properties.MqttUrls; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class DefaultConfiguration{ @Bean @ConfigurationProperties(prefix = "mqtt") MqttUrlsmqttUrls(){ return new MqttUrls(); } @Bean @ConfigurationProperties(prefix = "router") Mappingsmappings(){ return new Mappings(); } @Value("${mqtt.clientId}") String clientId; }
上述代码中用到的对象类:
public class Mapping{ private String topicFilter; private String service; publicStringgetTopicFilter(){ return topicFilter; } public void setTopicFilter(String topicFilter){ this.topicFilter = topicFilter; } publicStringgetService(){ return service; } public void setService(String service){ this.service = service; } }
public class Mappings{ private List<Mapping> mappings = new ArrayList<>(); publicList<Mapping>getMappings(){ return mappings; } public void setMappings(List<Mapping> mappings){ this.mappings = mappings; } }
public class MqttUrls{ private List<String> urls = new ArrayList<>(); publicList<String>getUrls(){ return this.urls; } public void setUrls(List<String> urls){ this.urls = urls; } }
使用:
@RequestMapping("/") @RestController public class DefaultController{ @Autowired MqttUrls mqttUrls; @Autowired Mappings mappings; @GetMapping(value = "/urls/show") publicList<String>show(){ return mqttUrls.getUrls(); } @GetMapping("/mappings/show") publicList<Mapping>showMappings(){ return mappings.getMappings(); } }