2016-05-17 3 views
1

xml変換にはバネ積分のxslt-transfomerを使用しています。実行時に動的に:私のコードは、以下のようにここにxslt-transformerにXSLリソースを動的に(プログラム的に)追加するには?

<int-xml:xslt-transformer id="xmlTransformer" input-channel="inputChannel" 
     output-channel="outputChannel" xsl-resource="classpath:META-INF/OrderXslt.xsl" /> 

ある 私はXSL-リソース= "META-INF/OrderXslt.xslクラスパス" を渡したいです。私は文脈からxmlTransformer豆を得ることができますが、設定方法を理解することができませんxsl-resource私のJavaコードは、任意のプログラムの説明は非常に理解されるであろう

File myFile = new File("D:\OrderXslt.xsl"); 
EventDrivenConsumer transformerConsumer = (EventDrivenConsumer) ctx.getBean("xmlTransformer"); 

//I need to pass myFile to transformerConsumer instace. 
//However I am unable to find any API of EventDrivenConsumer 
      which will accept xsl resource form here (i.e. myFile) 

、のようなものです。 ありがとうございます。

EDIT

public class TempTransformer<Object, Obejct> extends AbstractTransformer { 

    private volatile XsltPayloadTransformer xslt; 

    protected Object doTransform(Message<?> message) throws Exception { 
     return (Object) findorBuildTransformerForMessage(message).transform(message); 
//Its throwing error here as 
//org.springframework.integration.transformer.MessageTransformationException: failed to transform message; nested exception is java.lang.NullPointerException 
    } 

    private Transformer findorBuildTransformerForMessage(Message<?> message{ 
    xslt = new XsltPayloadTransformer(new ClassPathResource("/META-INF/OrderXslt2.xsl")); 
    return xslt; 
    } 

私は次のようにXsltPayloadTransformer実装したEDIT

protected Message<?> doTransform(Message<?> message) throws Exception { 
    xsltTransformer = new XsltPayloadTransformer(new ClassPathResource("D:/sample.xsl")); 

    this.xsltTransformer.setResultType("StringResult"); 
    this.xsltTransformer.afterPropertiesSet(); 
    return this.xsltTransformer.transform(message); 

    } 

しかし、正しい出力が得られません。一方、私はSaxon実装を使用し、正しい出力を示すシンプルなJavaプログラムを持っています。ここにあります...

私は何が欠けているのか理解できません。私はXsltPayloadTransformerに設定する必要がある何か他にありますか?または私は何かに欠けている? 私は使用していますXSL v2春4.1.7バネ統合4.1.8 vesrions。ハンドラのtransformerプロパティ -

答えて

1

は3つの関与のクラス、EventDrivenConsumerMessageTransformingHandler(消費者の財産handler)とXsltPayloadTransformerがあります。

XsltPayloadTransformerには現在リソースを変更するAPIがありません。これはコンストラクタ引数で提供されるため、新しいものを作成する必要があります。

MessageTransformingHandlerには変圧器を変更するAPIがありません。最終的なもので、コンストラクタargです。だから新しいものを作る必要があります。

EventDrivenTransformerには、ハンドラを変更するAPIはありません。最終的には、コンストラクタargです。

したがって、結論としては、標準のすぐに使用できるコンシューマではできないことです。

しかし、XsltPayloadTransformerに委譲する独自のBeanを作成して、必要に応じて新しいものに置き換えることができます。プログラムでXsltPayloadTransformerを作成する場合は、afterPropertiesSet()に電話する必要があります。これはセットアップが完了した場所だからです。

API for the EventDrivenConsumer is hereただし、上記の理由でお役に立てません。

また、Templatesオプションを使用して独自のラッパーを記述して、リソースを動的に変更することもできます。

EDIT説明のため

<int:transformer ... ref="myTransformer" /> 

public class Foo<Object, Object> extends AbstractTransformer<T, U> { 

    private final ConcurrentMap<String, Transformer> xslts = new ConcurrentHashMap<>(); 

    protected Object doTransform(Message<?> message) throws Exception { 

     return findorBuildTransformerForMessage(message).transform(message); 
    } 

    private Transformer findorBuildTransformerForMessage(Message<?> message) { 
     // retrieve from map or create and add it to map 
    } 
} 
+0

@GarryRussellのおかげで、それでも私はXsltPayloadTransformerの代表団と混乱していますし、どのように私は新しいものと交換する必要があります。 –

+0

私の編集例を見てくださいが、私はテンプレートアプローチを使うと思います。 –

+0

@Garryスレッドセーフな方法が必要です。どのように使用するのですか Transformerアノテーションはスレッドセーフであり、その実装を使用できます。 (最新の編集をご覧ください) –

関連する問題