Spring Injecting util: карта в Котлине с типом безопасности

У меня есть несколько определений bean-элементов в XML для хранения моего SQL-файла извне. Я хочу добавить их в Kotlin как Map<String,String> но единственный способ, которым я смог заставить его работать до сих пор, вводит его как Map<Any,Any> . Есть ли способ обеспечить безопасность типов здесь. Внедряя его как Map<Any,Any> чувствует гетто.

Когда я пытаюсь использовать Map<String,String> или даже Map<String,Any> я не получаю не соответствующие атрибуты beans …

Пример XML

 <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <util:map id="brandSql" key-type="java.lang.String" value-type="java.lang.String"> <entry key="selectBrands"> <value type="java.lang.String"> <![CDATA[ SELECT ID, NAME FROM BRAND ]]> </value> </entry> </util:map> </beans> 

Впрыск в эксплуатацию

 @Service open class JdbcBrandService @Autowired constructor( private val namedJdbcTemplate: NamedParameterJdbcTemplate ): BrandService { companion object { val logger = LoggerFactory.getLogger(JdbcBrandService::class.java) } @Autowired @Qualifier(value = "brandSql") private lateinit var queries: Map<Any,Any> /// methods and what not go here } 

В Java я могу уйти от выполнения чего-то вроде следующего, но система типа Kotlin, являющаяся более строгой, кажется, предотвращает это.

 @RestController public class JavaBrandController { private final Map<String, String> brandSql; @Autowired public JavaBrandController(@Qualifier("brandSql") Map sql) { this.brandSql = sql; } @GetMapping("/javaBrands") public Map getBrandSql() { return this.brandSql; } } 

    Лично, странно, что у вас есть бобы, которые имеют такие общие типы, как Map<String, String> . Это создаст путаницу, когда вам понадобятся другие карты.

    Я хотел бы создать класс контейнера, который содержит ссылку на карту, поэтому у вас есть правильный тип ссылки.

    Пример:

     class SqlConfig(val map: Map<String, String>) 

    Затем создайте компонент этого типа в xml:

     <util:map id="brandSql" key-type="java.lang.String" value-type="java.lang.String"> <entry key="selectBrands"> <value type="java.lang.String"> <![CDATA[ SELECT ID, NAME FROM BRAND ]]> </value> </entry> </util:map> <bean id = "sqlConfig" class = "test.package.SqlConfig"> <constructor-arg ref = "brandSql"/> </bean> 

    Теперь вы можете автоустанавливать его по мере необходимости с правильным типом в не-guetto способом:

     @Autowired @Qualifier(value = "sqlConfig") // <-- the qualifier is no longer needed private lateinit var queries: SqlConfig