【问题标题】:No converter found capable of converting from type [java.lang.String] to type [java.util.LinkedHashMap<java.lang.String, java.lang.String>]找不到能够从类型 [java.lang.String] 转换为类型 [java.util.LinkedHashMap<java.lang.String, java.lang.String>] 的转换器
【发布时间】:2019-05-17 13:57:42
【问题描述】:

spring boot 2.1.1 无法读取 yml 配置到 LinkedHashMap

这是我的课

我提供了 get 和 set 函数。但它不起作用。

@Getter
@Setter
@Configuration
@ConfigurationProperties("shiro")
public class ShiroConfiguration {
    private LinkedHashMap<String, String> filterChainDefinitions;
}

这是我的配置

shiro:
  filterChainDefinitions:
    /**: origin

这是错误信息

Description:

Failed to bind properties under 'shiro.filter-chain-definitions' to java.util.LinkedHashMap<java.lang.String, java.lang.String>:

    Reason: No converter found capable of converting from type [java.lang.String] to type [java.util.LinkedHashMap<java.lang.String, java.lang.String>]

Action:

Update your application's configuration

【问题讨论】:

  • 你能解决吗
  • 你解决了吗?

标签: spring spring-boot yaml


【解决方案1】:

键中的特殊字符(/*)正在解除绑定。带有特殊字符的映射键需要用方括号括起来。以下应该可以工作:

shiro:
  filterChainDefinitions:
    '[/**]': origin

【讨论】:

    【解决方案2】:

    @ConfigurationProperties 无法从您的属性映射 LinkedHashMap。您必须使用 here 中提到的不支持的 SpEL

    要解决您的问题,可以通过添加 @Value 注释来更新配置,例如:

    @Getter
    @Setter
    @Component
    public class ShiroConfiguration {
    
      @Value("#{${shiro.filter-chain-definitions}}")
      private LinkedHashMap<String, String> filterChainDefinitions;
    
    }
    

    【讨论】:

      【解决方案3】:

      尝试使用这样的块映射:

      shiro:
        filterChainDefinitions:
          {}
      

      当 shiro.filterChainDefinitions 的值为空时,它将被解释为空字符串。 YAML 无法知道它应该是 LinkedHashMap。使用空块映射来表示空Hashmap。

      来自docs: 块映射是一系列条目,每个条目表示一个键:值对。

      【讨论】:

        【解决方案4】:

        这可能是您调用配置属性的方式的问题。

        您是否尝试过重命名属性路径:

        filterChainDefinitionsfilter

        private LinkedHashMap&lt;String, String&gt; filterChainDefinitions;

        private LinkedHashMap&lt;String, String&gt; filter;?

        有时也可能由于错误的编码或转义而发生此类错误,但这里似乎并非如此。

        【讨论】:

        • 重命名变量,也不行,spring boot 1.5.*没问题。
        【解决方案5】:

        您可以使用配置属性。例

        @Component
        @EnableConfigurationProperties
        @ConfigurationProperties(prefix = "shiro")
        class YourComponent {
        
            private HashMap<String, Integer> filterChainDefinitions;
        
            public HashMap<String, Integer> getFilterChainDefinitionsta() {
                return filterChainDefinitions;
            }
        
            public void setFilterChainDefinitions(HashMap<String, Integer> filterChainDefinitions) {
                this.filterChainDefinitions= filterChainDefinitions;
            }
        
        }
        

        【讨论】:

        • 我提供了 get 和 set 函数。但它不起作用。
        • 你添加@EnableConfigurationProperties了吗?
        • 我没做,除了地图其他都正常
        猜你喜欢
        • 1970-01-01
        • 2021-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-19
        • 2019-02-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多