2017-11-17 9 views
1

私はSQLに外部的にSQLを格納するいくつかのBean定義をXMLに持っています。私はMap<String,String>としてKotlinにそれらを注入したいと思っていますが、これまでのところ私はそれをMap<Any,Any>として注入することができました。ここでタイプの安全を確保する方法はありますか? Map<Any,Any>としてそれを注入すると、ゲットーを感じる。私は逃げることができSpring Injecting util:型安全性を備えたKotlinのマップ

私は私が見つけた豆を満たさない取得Map<String,String>を試したり、Map<String,Any> ... Javaでは

例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 
} 

次のようなことをしていますが、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; 
    } 
} 

答えて

2

個人的には、Map<String, String>のような一般的なタイプの豆を浮かべるのが奇妙に感じられます。他のマップが必要なときは、混乱を招きます。

私が行うことは、マップへの参照を保持するコンテナクラスを作成することです。そのため、参照する適切な型があります。

例:

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

次に、あなたのXMLで、このタイプのBeanを作成します。

<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方法で、適切なタイプで、必要に応じて今、あなたはそれをautowireすることができます:

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

Map をSQLの@Qualifierとともに使用すると、より多くのまたはより小さいここでは標準的な操作手順を示していますが、私は外部のSQLクエリの方が良い方法を公開していますが、クエリの中には500-1000行しかないものがあります。私はあなたのソリューションを試して、それはうまくいきます!これは、KotlinとSpringがまだ統合していない場所の1つと思われますが、この方法では型の安全性が確保され、コード内でキャストを行うことが回避されます。 – greyfox

+0

@greyfoxもしあなたがクエリを保存する別の方法を探しているなら、私はこの質問と答えのソリューションが好きです:https://codereview.stackexchange.com/questions/140938/reading-sql-file-using-injection-ユーティリティーリーダー – ESala

関連する問題