2009-11-10 4 views
4

Comment puis-je configurer java.xml.transform.Transformer dans le cadre du printemps? J'ai besoin d'une instance de transformateur pour transformer xml en texte via xslt. Il est donc essentiel que le transformateur configuré ait une connaissance de la feuille de style xslt. Je n'utilise pas cela dans un projet web, je l'utilise plutôt dans un programme Java autonome.comment configurer java.xml.transform.transformer au printemps

+0

Vous voulez dire 'javax.xml.transform.Transformer', n'est-ce pas? –

Répondre

2

Vous aurez besoin d'obtenir une instance d'un Transformer à partir d'un TransformerFactory approprié. Vous pouvez utiliser la fabrique de transformateurs xerces intégrée ou un processeur XSLT tiers, par exemple saxonica.

L'utilisation IoC de printemps, vous pouvez configurer un transformateur XML Xerces comme ceci:

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

ou un transformateur XML Saxonne comme ceci:

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

Une fois que vous avez un TransformerFactory vous pouvez utiliser l'injection de dépendance à obtenir une nouvelle instance d'un transformateur soit à l'intérieur de votre bean ou en utilisant l'IoC. Le passage à être à l'intérieur de votre classe, vous pourriez avoir une propriété, par exemple transFact que vous devez définir:

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

Puis dans votre classe:

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; 
    } 
} 

Sinon, vous pouvez obtenir un nouveau transformateur au sein IoC utilisant le factory-method avec un peu plus d'effort.

5

Eh bien, Java pour configurer un transformateur est comme ceci:

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

Si vous voulez vraiment faire uniquement en XML Spring, c'est l'équivalent:

<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

Merci pour votre réponse. Je me demandais pourquoi le printemps ne pouvait pas fournir un peu plus de soutien de sorte que tout ce que je dois faire est de passer le nom de mon xslt et il devrait le localiser sur le classpath et construire configurer le transformateur. Aussi, je crois que je pourrais avoir besoin de définir certaines propriétés sur le transformateur – Jimm

+0

Oublié to meanion scope = prototype – alexsmail

+3

Ceci est vieux, mais je dois donner aux gens des conseils pour probablement ne pas faire cela. Puisque les beans sont des singletons par défaut dans Spring, même si vous fabriquez des transformateurs et des prototypes de transformateurs, il sera très facile pour un autre développeur de les injecter dans un bean singleton et de ne pas réaliser qu'ils ont juste créé un problème de sécurité. Au lieu de cela, je voudrais créer une classe d'aide qui résume ces détails d'implémentation pour rendre beaucoup plus difficile de se tromper. – jjathman

2

J'ai trouvé façon de fournir le fichier xsl du classpath:

<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> 

assez laid, mais ça fonctionne !