今天在Spring配置文件中配置如下事務屬性時,提示<tx is not bound(不受約束的),估計是配置文件的xsd沒配置好。
<!-- 2.配置事務屬性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="get*" read-only="true"></tx:method> <tx:method name="*"></tx:method> </tx:attributes> </tx:advice>
在xsi:schemaLocation=中增加:
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
錯誤就消失了。
網上查閱了相關資料,現總結如下:
xml文檔要有格式,為了Spring的配置文件增加的節點(比如<tx:advice)能符合要求、合法,必須通過引入校驗該xml格式的文件,也就是xsd文件。Spring通過配置可以聯網引入xsd文件,也可以在斷網下使用本地xsd文件校驗xml文件。
xsi:schemaLocation 屬性提供一種方法來查找在 XML 實例文檔中定義的命名空間的 XML 架構定義。它的值是用空白分隔的統一資源標識符 (URI) 對的列表,其中的每一對 URI 都依次包含一個命名空間以及該命名空間的 XML 架構定義(通常為 .xsd 文件)的位置。
xsi:schemaLocation 提供了xml的namespace到對應的xsd文件的映射,從下列配置可以看出xsi:schemaLocation 里面配置的字符串都是成對的,前面是namespace的URI,后面是xsd文件的URI。
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
Spring在啟動時默認要加載xsd文件來驗證XML文件的,在瀏覽器中輸入復制的xmlns:tx的鏈接,也就是http://www.springframework.org/schema/tx,可以看到如下頁面:
以上都是可選的tx的xsd版本,而xsi:schemaLocation的http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 在用瀏覽器訪問是該版本xsd對應內容的頁面:
箭頭指的就是對<tx:advice進行xml校驗的部分,從上面代碼看出,tx還可以添加<tx:annotation-driven,<tx:jta-transaction-manager 節點,這個與xml中的提示是一致的:
advice部分的具體代碼如下:

1 <xsd:element name="advice"> 2 <xsd:complexType> 3 <xsd:annotation> 4 <xsd:documentation source="java:org.springframework.transaction.interceptor.TransactionInterceptor"> 5 <![CDATA[ 6 Defines the transactional semantics of the AOP advice that is to be executed. That is, this advice element is where the transactional semantics of any number of methods are defined (where transactional semantics includes the propagation settings, the isolation level, the rollback rules, and suchlike). 7 ]]> 8 </xsd:documentation> 9 <xsd:appinfo> 10 <tool:annotation> 11 <tool:exports type="org.springframework.transaction.interceptor.TransactionInterceptor"/> 12 </tool:annotation> 13 </xsd:appinfo> 14 </xsd:annotation> 15 <xsd:complexContent> 16 <xsd:extension base="beans:identifiedType"> 17 <xsd:sequence> 18 <xsd:element name="attributes" type="attributesType" minOccurs="0" maxOccurs="1"/> 19 </xsd:sequence> 20 <xsd:attribute name="transaction-manager" type="xsd:string" default="transactionManager"> 21 <xsd:annotation> 22 <xsd:documentation source="java:org.springframework.transaction.PlatformTransactionManager"> 23 <![CDATA[ 24 The bean name of the PlatformTransactionManager that is to be used to drive transactions. This attribute is not required, and only needs to be specified explicitly if the bean name of the desired PlatformTransactionManager is not 'transactionManager'. 25 ]]> 26 </xsd:documentation> 27 <xsd:appinfo> 28 <tool:annotation kind="ref"> 29 <tool:expected-type type="org.springframework.transaction.PlatformTransactionManager"/> 30 </tool:annotation> 31 </xsd:appinfo> 32 </xsd:annotation> 33 </xsd:attribute> 34 </xsd:extension> 35 </xsd:complexContent> 36 </xsd:complexType> 37 </xsd:element>
如果此時無法上網,就無法從該網站獲取到該xsd文件,就無法對xml文件進行校驗了,容易發生應用啟動不了的情況。為此我們可以加載本地的xsd文件,這樣斷網情況下也可以啟動應用了。舉例子來說,若tx的xsd文件沒有配置,則要進行如下步驟進行配置:
1、點開項目的lib,找到spring-tx-4.1.4.RELEASE.jar,右鍵屬性-復制文件路徑(復制jar之前的路徑),在文件夾地址欄粘貼,回車打開;
2、將spring-tx-4.1.4.RELEASE.jar解壓到某個文件夾,有如下文件:
3、在org\springframework\transaction\config路徑下可以找到:
里面還有舊版本的xsd文件,這樣可以避免配置文件用的還是舊版本的xsd文件,而Spring是新版本情況下,斷網應用啟動不了的情況。Spring這個確實想得挺周到的。
4、將tx的某個版本的xsd文件拷貝到工程的source folder下,然后xml的配置改成如下形式:
xsi:schemaLocation="http://www.springframework.org/schema/beans classpath:beans/spring-beans-4.1.xsd http://www.springframework.org/schema/mvc classpath:mvc/spring-mvc-4.1.xsd http://www.springframework.org/schema/context classpath:context/spring-context-4.1.xsd http://www.springframework.org/schema/aop classpath:aop/spring-aop-4.1.xsd http://www.springframework.org/schema/tx classpath:tx/spring-tx-4.1.xsd ">
這樣就可以從本地獲取xsd文件,就算斷網也可以解析xml文件了。
附一份常見的spring配置文件的文件頭:
------------------------------------3.0---------------------------- <?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> </beans>
當然你也可以根據使用的Spring的相應jar包版本更改對應的版本,比如上面的3.0可以改成4.1也行。
http://www.springframework.org/schema/ 該網站是Spring所有可能用到的結點屬性的xsd列表,點擊相應選項即可查到對應的xsd版本與xsd的URI: