【问题标题】:Spring bean initialization - ClojureSpring bean 初始化 - Clojure
【发布时间】:2012-05-17 10:41:42
【问题描述】:

我有一个 clojure 类,我使用 spring bean 初始化来初始化它。

我的setter方法如下

(defn -setCompanyName [货币] (println (str "company : " company)))

Bean初始化如下

<bean id="company" class="test.Company"
        p:companyName="orce"/>

我收到以下错误。

bean 类 [test.Company] 的无效属性“companyName”:Bean 属性 “companyName”不可写或设置方法无效。做 setter 的参数类型是否与 getter 的返回类型匹配?

有谁知道这个问题的根本原因。

问候 伊苏鲁。

【问题讨论】:

    标签: spring clojure


    【解决方案1】:

    此特定问题有多种可能的原因,因此如果没有您的所有代码,很难说出失败的原因。

    下面是适合我的代码:

    (ns test)
    
    (gen-class
       :main false
       :name test.Company
       :methods [[setCompanyName [String] void]])
    
    (defn -setCompanyName [this company] (println (str "company : " company)))
    

    注意事项:

    • 你确实不需要需要任何吸气剂
    • 方法的签名在 :methods 向量中指定。
    • 您的函数应该有一个额外的“this”参数
    • gen-class 宏根据宏的参数生成一个类,因此它根本不查看 -setCompanyName 函数定义。

    我发现 javap 命令对于查看 gen-class 正在生成什么非常有用:

    javap.exe -classpath classes/ test.Company
    public class test.Company extends java.lang.Object{
        public static {};
        public test.Company();
        public java.lang.String toString();
        public boolean equals(java.lang.Object);
        public java.lang.Object clone();
        public int hashCode();
        public void setCompanyName(java.lang.String);
    }
    

    我还建议您查看http://clojuredocs.org/clojure_core/clojure.core/gen-class 上的第二个示例,了解如何管理状态。

    【讨论】:

    • 您确定不需要 getter 吗?该错误明确提及它,并且根据我的经验,Java bean 相关代码通常需要它。
    • 您好 Andrew,我在发布响应之前测试了代码,所以是的,我确信您不需要 getter。
    【解决方案2】:

    你不需要另一个函数参数吗?第一个充当“this”指针。我现在无法测试这个,因为我在我的手机上。

    【讨论】: