• spring boot升级到2.0.0.M7后报错ConverterNotFoundException for java.time.Duration的解决方案


    最近学习搭建spring boot的脚手架过程中,boot的版本升级成了2.0.0.M7,然后发现项目启动之后redis配置那块报了错。错误信息如下

    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'spring.redis-org.springframework.boot.autoconfigure.data.redis.RedisProperties': Could not bind properties to 'RedisProperties': prefix=spring.redis, ignoreInvalidFields=false, ignoreUnknownFields=true; nested exception is org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'spring.redis.jedis.pool.max-wait' to java.time.Duration
        at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:170)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:423)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1702)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:583)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
        at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:251)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1135)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1062)
        at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:815)
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:721)
        ... 42 more
    Caused by: org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'spring.redis.jedis.pool.max-wait' to java.time.Duration
        at org.springframework.boot.context.properties.bind.Binder.handleBindError(Binder.java:227)
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:203)
        at org.springframework.boot.context.properties.bind.Binder.lambda$bindBean$4(Binder.java:313)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:70)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:59)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:51)
        at org.springframework.boot.context.properties.bind.Binder.lambda$null$5(Binder.java:321)
        at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
        at java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1351)
        at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
        at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
        at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)
        at org.springframework.boot.context.properties.bind.Binder.lambda$bindBean$6(Binder.java:322)
        at org.springframework.boot.context.properties.bind.Binder$Context.withIncreasedDepth(Binder.java:415)
        at org.springframework.boot.context.properties.bind.Binder$Context.withBean(Binder.java:405)
        at org.springframework.boot.context.properties.bind.Binder.bindBean(Binder.java:319)
        at org.springframework.boot.context.properties.bind.Binder.bindObject(Binder.java:261)
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:198)
        at org.springframework.boot.context.properties.bind.Binder.lambda$bindBean$4(Binder.java:313)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:70)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:59)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:51)
        at org.springframework.boot.context.properties.bind.Binder.lambda$null$5(Binder.java:321)
        at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
        at java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1351)
        at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
        at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
        at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)
        at org.springframework.boot.context.properties.bind.Binder.lambda$bindBean$6(Binder.java:322)
        at org.springframework.boot.context.properties.bind.Binder$Context.withIncreasedDepth(Binder.java:415)
        at org.springframework.boot.context.properties.bind.Binder$Context.withBean(Binder.java:405)
        at org.springframework.boot.context.properties.bind.Binder.bindBean(Binder.java:319)
        at org.springframework.boot.context.properties.bind.Binder.bindObject(Binder.java:261)
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:198)
        at org.springframework.boot.context.properties.bind.Binder.lambda$bindBean$4(Binder.java:313)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:70)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:59)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:51)
        at org.springframework.boot.context.properties.bind.Binder.lambda$null$5(Binder.java:321)
        at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
        at java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1351)
        at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
        at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
        at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)
        at org.springframework.boot.context.properties.bind.Binder.lambda$bindBean$6(Binder.java:322)
        at org.springframework.boot.context.properties.bind.Binder$Context.withIncreasedDepth(Binder.java:415)
        at org.springframework.boot.context.properties.bind.Binder$Context.withBean(Binder.java:405)
        at org.springframework.boot.context.properties.bind.Binder.bindBean(Binder.java:319)
        at org.springframework.boot.context.properties.bind.Binder.bindObject(Binder.java:261)
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:198)
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:187)
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:169)
        at org.springframework.boot.context.properties.ConfigurationPropertiesBinder.bind(ConfigurationPropertiesBinder.java:77)
        at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:167)
        ... 55 more
    Caused by: org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.Integer] to type [java.time.Duration]
        at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:321)
        at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:194)
        at org.springframework.boot.context.properties.bind.convert.BinderConversionService.lambda$convert$1(BinderConversionService.java:77)
        at org.springframework.boot.context.properties.bind.convert.BinderConversionService.callConversionService(BinderConversionService.java:85)
        at org.springframework.boot.context.properties.bind.convert.BinderConversionService.convert(BinderConversionService.java:77)
        at org.springframework.boot.context.properties.bind.ResolvableTypeDescriptor.convert(ResolvableTypeDescriptor.java:64)
        at org.springframework.boot.context.properties.bind.Binder.convert(Binder.java:233)
        at org.springframework.boot.context.properties.bind.Binder.bindProperty(Binder.java:303)
        at org.springframework.boot.context.properties.bind.Binder.bindObject(Binder.java:249)
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:198)
        ... 119 more

    核心错误即是ConverterNotFoundException: No converter found capable of converting from type [java.lang.Integer] to type [java.time.Duration]

    通过一番查找后在spring boot的官方GitHub的一个issue中找到解答,该错误会出现在使用的是YAML配置,因为对于数值类型参数会强转为数值类型。这个问题是M7版本的一个bug。

    解决方案是用双引号将参数值包装。

    server:
      session:
        timeout: "60"
  • 相关阅读:
    几种回文算法的比较
    算法与数据结构(五)树表的查找
    算法与数据结构(四)利用哈夫曼树编码解码
    算法与数据结构(三)线性表的查找算法
    主存和cache的地址映射
    算法与数据结构(二)三元组矩阵行列式的计算(用递归)
    算法与数据结构(一)将一个数组中的各节点按照层次遍历插入构成完全二叉树
    服务器被攻击,我真是个人才。
    想学嘛,不想学? 自学是门手艺
    想学嘛,技术人, 请不要封闭自己
  • 原文地址:https://www.cnblogs.com/magotzis/p/8384952.html
Copyright © 2020-2023  润新知