使用SpringBoot的yml文件配置时踩的一个坑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用SpringBoot的yml文件配置时踩的一个坑相关的知识,希望对你有一定的参考价值。

参考技术A 问题描述:使用SpringBoot整合redis进行yml配置的时候,启动工程报错,提示加载application.yml配置文件失败的日志:

17:18:27.430[main] ERROR org.springframework.boot.SpringApplication -Application startup failedjava.lang.IllegalStateException:Failed to load property source from location'classpath:/application.yml'at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.loadIntoGroup(ConfigFileApplicationListener.java:476)

at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.load(ConfigFileApplicationListener.java:465)

at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.load(ConfigFileApplicationListener.java:386)

at org.springframework.boot.context.config.ConfigFileApplicationListener.addPropertySources(ConfigFileApplicationListener.java:225)

at org.springframework.boot.context.config.ConfigFileApplicationListener.postProcessEnvironment(ConfigFileApplicationListener.java:195)

at org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEnvironmentPreparedEvent(ConfigFileApplicationListener.java:182)

at org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEvent(ConfigFileApplicationListener.java:168)

at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167)

at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)

at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:122)

at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:74)

at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54)

at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:325)

at org.springframework.boot.SpringApplication.run(SpringApplication.java:296)

at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)

at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)

at com.zhaopin.ImccApplication.main(ImccApplication.java:10)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

Caused by: org.yaml.snakeyaml.parser.ParserException:whileparsing MappingNode in'reader', line15,

column1:server:^Duplicate key: spring

in'reader', line59, column1:^at org.springframework.beans.factory.config.YamlProcessor$StrictMapAppenderConstructor.constructMapping(YamlProcessor.java:411)

at org.yaml.snakeyaml.constructor.SafeConstructor$ConstructYamlMap.construct(SafeConstructor.java:489)

at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:182)

at org.yaml.snakeyaml.constructor.BaseConstructor.constructDocument(BaseConstructor.java:141)

at org.yaml.snakeyaml.constructor.BaseConstructor.getData(BaseConstructor.java:108)

at org.yaml.snakeyaml.Yaml$1.next(Yaml.java:471)

at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:160)

at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:138)

at org.springframework.boot.env.YamlPropertySourceLoader$Processor.process(YamlPropertySourceLoader.java:101)

at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:58)

at org.springframework.boot.env.PropertySourcesLoader.load(PropertySourcesLoader.java:127)

at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.doLoadIntoGroup(ConfigFileApplicationListener.java:490)

at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.loadIntoGroup(ConfigFileApplicationListener.java:473)

...21common frames omitted

Process finished with exit code1

application.yml配置截图:

注意图中有以spring开头的配置项,出现了两个spring,这是不符合yml配置语法的,所以启动报错。

解决方式:将yml配置文件修改为如下样子,再启动SpringBoot工程就不会报错了:

django中使用filter()(即对QuerySet操作)时踩的坑

代码伺候:

  先看如下代码:

例1:

         message = Message.objects.filter(pk=message_id2)

            message[0].id = message_id2
            message[0].content = content2
            message[0].message_type = message_type2
       print(message[0].id)
       print(message[0].content)

            message[0].save()

 

  可正常从QuerySet中读取数据,并打印出来,无误。可是无法将数据同步到数据库中。

  

      (1)all()返回的是QuerySet对象,程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使用for循环可以获取数据。

         例如有Book表,其包含bookname,booknum两个属性, 如何使用Objects.all(),得到bookname和booknum的值

 (2)filter() 返回的是QuerySet对象,与all()相似,只是all()是查询所有数据,常用:filter表示‘ = ’,exclude表示’ != ’。

   (3)get()返回的是Model对象,类型为列表,说明使用get方法会直接执行sql语句获取数据。

  

  来看一个QuerySet对象:

  技术图片

 

 

  message = Message.objects.filter(pk=message_id2)

   message[0].content

  这样子确实可以读取到QuerySet中的数据,可是对QuerySet修改后的数据无法保存到数据库。

  例1中不要尝试通过message.save()的方式去同步数据到数据库,因为QuerySet不存在save()方法。

 

       正确写法如下: 

    要想同步到数据库中,需使用对象进行数据同步操作。

例2:

       message = Message.objects.filter(pk=message_id2).first()

           
            message.id = message_id2
            message.content = content2
            message.message_type = message_type2
            message.save()

 

以上是关于使用SpringBoot的yml文件配置时踩的一个坑的主要内容,如果未能解决你的问题,请参考以下文章

MAC本apache+php配置虚拟域名时踩的坑

初次使用antd-mobile开发时踩的坑

记录使用git submodule时踩的坑

使用Ajax中get请求发送Token时踩的那些坑

django中使用filter()(即对QuerySet操作)时踩的坑

redhat 7.2更新yum源时踩的坑