2009-11-10 2 views
4

Как настроить java.xml.transform.Transformer в Spring Framework? Мне нужен экземпляр трансформатора для преобразования xml в текст через xslt. Поэтому очень важно, чтобы сконфигурированный трансформатор должен был знать таблицу стилей xslt. Я не использую это в веб-проекте, но я использую это в автономной программе java.Как настроить java.xml.transform.transformer весной

+0

Вы имеете в виду 'javax.xml.transform.Transformer', не так ли? –

ответ

2

Вам необходимо получить экземпляр Transformer из соответствующего TransformerFactory. Вы можете использовать встроенную фабрику трансформаторов 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 вы можете использовать инъекции зависимостей для получить новый экземпляр трансформатора либо внутри вашего компонента, либо с помощью 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

Спасибо за ответ. Мне было интересно, почему весна не может обеспечить немного больше поддержки, так что все, что мне нужно сделать, это передать имя моего xslt, и он должен найти его на пути к классам и построить конфигурацию трансформатора. Кроме того, я считаю, что мне, возможно, потребуется установить некоторые свойства на трансформаторе. – Jimm

+0

Забыл в medion scope = prototype – alexsmail

+3

Это старый, но я должен дать людям некоторые советы, возможно, просто не делать этого. Так как bean-компоненты по умолчанию весны, даже если вы создаете прототипы transformerfactory и transformer, для другого разработчика будет очень просто ввести его в одноэлементный компонент и не понимать, что они только что создали проблему безопасности потоков. Вместо этого я бы создал вспомогательный класс, который обертывает эти детали реализации, чтобы сделать его намного сложнее ошибиться. – jjathman

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> 

Довольно уродливый, но это работает !

Смежные вопросы