当前位置: 首页 > 知识库问答 >
问题:

带类型安全的Kotlin中的Spring注入UTIL:Map

吕高寒
2023-03-14
<?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
}
@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;
    }
}

共有1个答案

李永寿
2023-03-14

就我个人而言,让像map 这样的泛型类型的bean四处漂浮感觉很奇怪。当你需要其他地图时,这会造成混乱。

我要做的是创建一个容器类,它保存对映射的引用,这样您就有了一个合适的类型来引用。

示例:

class SqlConfig(val map: Map<String, String>)
<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>
@Autowired
@Qualifier(value = "sqlConfig") // <-- the qualifier is no longer needed
private lateinit var queries: SqlConfig
 类似资料:
  • 如果你正在使用Java 7工作的话,null安全是Kotlin中最令人感兴趣的特性之一了。但是就如你在本书中看到的,它好像不存在一样,一直到上一章我们几乎都不需要去担心它。 通过我们自己创造的亿万美金的错误对null的思考,我们有时候的确需要去定义一个变量包不包含一个值。在Java中尽管注解和IDE在这方面帮了我们很多,但是我们仍然可以这么做: Forecast forecast = null;

  • 大部分现代语言使用某些方法去解决了这个问题,Kotlin的方法跟别的相似的语言比是相当另类和不同的。但是黄金准则还是一样:如果变量是可以是null,编译器强制我们去用某种方式去处理。 指定一个变量是可null是通过在类型的最后增加一个问号。因为在Kotlin中一切都是对象(甚至是Java中原始数据类型),一切都是可null的。所以,当然我们可以有一个可null的integer: val a: In

  • 如何避免对类的可选属性使用 我应该创建一个局部变量吗?我认为使用不是一个好的做法

  • 我正在尝试配置Spring Security注释,我已经设法在xml中设置了Spring Security配置(由intercept-url元素配置),但是现在我想在我的beans中使用安全注释。但是当试图在没有记录的情况下访问安全控制器方法时,安全注释被完全忽略。这是我的控制器bean: 和登录控制器: 和配置:web.xml Spring-套筒.xml 和Spring安全.xml 如果需要,我

  • 我有我的spring boot应用程序,我正在尝试添加Spring Security性,但当我通过postman发出请求时,我不断收到一个403 Forbbiden,联机时我发现我应该在我的配置中添加:“.csrf().disable()”,但它不起作用(如果我在permitAll()中放置路径为:“person/**”的方法,则所有操作都有效) 这是我的代码: 我的用户控制器: My perso

  • 我想在Kotlin中为具有不可变属性的类型使用类型安全生成器。 我想到了两种解决方案: 选项 1:创建生成器类: 选项2:创建自定义委托以防止再次设置该值: 选项1的缺点是我必须维护两个类,选项2的缺点是编译器将允许再次设置< code>DataClass中的值,并且检查将只在运行时进行。 有没有更好的方法来解决这个问题而没有提到的缺点?