2009-11-10 55 views
4

如何在spring框架中配置java.xml.transform.Transformer?我需要通過xslt將xml轉換爲文本的變換器實例。因此,配置好的變壓器應該知道xslt樣式表是至關重要的。我沒有在Web項目中使用它,而是在獨立的Java程序中使用它。如何在spring中配置java.xml.transform.transformer

+0

你的意思是'javax.xml.transform.Transformer',不是嗎? – 2009-11-10 02:40:16

回答

2

您將需要從適當的TransformerFactory獲得Transformer的實例。您可以使用內置的xerces變壓器工廠或第三方XSLT處理器,如saxonica

使用Spring的IoC可以配置的Xerces XML轉換器是這樣的:

<bean id="transformerFactory" class="org.apache.xerces.jaxp.SAXParserFactoryImpl" /> 

或撒克遜XML轉換器是這樣的:

<bean id="transformerFactory" class="net.sf.saxon.TransformerFactoryImpl" /> 

一旦你有一個TransformerFactory可以使用依賴注入在bean內部或使用IoC獲取變換器的新實例。切換到是你的類中,你可能有一些財產,說transFact,你需要設置:

<bean id="myBean" class="myClass"> 
    <property name="transFact" ref="transformerFactory" /> 
</bean> 

然後在你的類:

public class myClass { 
    // ... 

    private javax.xml.transformer.TransformerFactory transFact; 


    public void myMethod(){ 
     StreamSource transformerStream = new StreamSource(getResourceAsStream(pathToXslt)); 
     javax.xml.transformer.Transformer myTrans = transFact.newTransformer(transformerStream); 
     // now you've got a myTrans 
    } 

    // ... 

    public setTransFact(javax.xml.transformer.TransformerFactory transFact){ 
     this.transFact = transFact; 
    } 
} 

另外,您可以使用內的IoC得到一個新的變壓器factory-method多花點功夫。

5

那麼,Java的配置變壓器是這樣的:

Source stylesheetSource = new StreamSource(new File("/path/to/my/stylesheet.xslt")); 
TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
Transformer transformer = transformerFactory.newTransformer(stylesheetSource); 

如果你真的想這樣做純粹是在Spring XML,這是等價的:

<bean id="stylesheetSource" class="javax.xml.transform.stream.StreamSource"> 
    <property name="systemId" value="/path/to/my/stylesheet.xslt"/> 
</bean> 

<bean id="transformerFactory" class="javax.xml.transform.TransformerFactory" factory-method="newInstance"/> 

<bean id="transformer" factory-bean="transformerFactory" factory-method="newTransformer"> 
    <constructor-arg ref="stylesheetSource"/> 
</bean> 
+0

感謝您的回覆。我想知道爲什麼Spring不能提供更多的支持,所以我需要做的就是傳遞我的xslt的名稱,並且它應該在類路徑中找到它並構建配置變換器。 此外,我相信我可能需要在變壓器上設置一些屬性 – Jimm 2009-11-10 12:21:08

+0

忘記到範圍範圍=原型 – alexsmail 2014-02-13 13:16:32

+3

這是舊的,但我必須給人一些建議,可能只是不這樣做。由於bean在Spring中是默認的單例,即使你創建了transformerfactory和轉換器原型,對於另一個開發人員來說,將它注入單例bean並且沒有意識到它們剛剛創建了線程安全問題將非常容易。相反,我會創建一個輔助類來包裝這些實現細節,使其更難以出錯。 – jjathman 2014-06-25 22:52:14

2

我發現這方式從類路徑提供xsl文件:

<bean id="errorLogTransformer" factory-bean="transformerFactory" factory-method="newTransformer" > 
    <constructor-arg> 
     <bean class="org.springframework.xml.transform.ResourceSource"> 
      <constructor-arg> 
       <value>classpath:errorLog.xsl</value> 
      </constructor-arg> 
     </bean> 
    </constructor-arg> 
</bean> 

很醜,但它的工作原理!

相關問題