2017-06-18 2 views
3

wso2 esb rest apiからPDFコンテンツに反応していて、ブラウザでviewにしたいと考えています。私はmessageFormattermessageBuilderapplication/pdfにも有効にしました。しかし、私がブラウザから私のAPIを呼び出すとき、私はwso2 esbの下で例外を得ています。WSO2からアプリケーション/ pdfコンテンツにどのように応答するのですか?ESB

axis2.xmlを:

<messageBuilder contentType="application/pdf" class="org.wso2.carbon.relay.BinaryRelayBuilder"/> 

<messageFormatter contentType="application/pdf" class="org.wso2.carbon.relay.ExpandingMessageFormatter"/> 

例外:

ERROR {org.apache.synapse.transport.passthru.PassThroughHttpSender} - Failed to submit the response {org.apache.synapse.transport.passthru.PassThroughHttpSender} 
java.lang.RuntimeException: ContentID is null 
    at org.apache.axiom.om.impl.llom.OMTextImpl.getDataHandler(OMTextImpl.java:381) 
    at org.wso2.carbon.relay.ExpandingMessageFormatter.findAndWrite2OutputStream(ExpandingMessageFormatter.java:179) 
    at org.wso2.carbon.relay.ExpandingMessageFormatter.writeTo(ExpandingMessageFormatter.java:97) 
    at org.apache.synapse.transport.passthru.PassThroughHttpSender.submitResponse(PassThroughHttpSender.java:573) 
    at org.apache.synapse.transport.passthru.PassThroughHttpSender.invoke(PassThroughHttpSender.java:264) 
    at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442) 
    at org.apache.synapse.core.axis2.Axis2Sender.sendBack(Axis2Sender.java:230) 
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send(Axis2SynapseEnvironment.java:531) 
    at org.apache.synapse.mediators.builtin.SendMediator.mediate(SendMediator.java:118) 
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:97) 
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:59) 
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158) 
    at org.apache.synapse.rest.Resource.process(Resource.java:343) 
    at org.apache.synapse.rest.API.process(API.java:338) 
    at org.apache.synapse.rest.RESTRequestHandler.apiProcess(RESTRequestHandler.java:123) 
    at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:101) 
    at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:56) 
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:304) 
    at org.apache.synapse.mediators.builtin.LoopBackMediator.mediate(LoopBackMediator.java:63) 
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:97) 
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:59) 
    at org.apache.synapse.config.xml.AnonymousListMediator.mediate(AnonymousListMediator.java:37) 
    at org.apache.synapse.config.xml.SwitchCase.mediate(SwitchCase.java:69) 
    at org.apache.synapse.mediators.filters.SwitchMediator.mediate(SwitchMediator.java:148) 
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:97) 
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:260) 
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.mediateFromContinuationStateStack(Axis2SynapseEnvironment.java:775) 
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:282) 
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:554) 
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:188) 
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) 
    at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:262) 
    at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Unexpected error sending message back {org.apache.synapse.core.axis2.Axis2Sender} 
org.apache.axis2.AxisFault: Failed to submit the response 
    at org.apache.synapse.transport.passthru.PassThroughHttpSender.handleException(PassThroughHttpSender.java:632) 
    at org.apache.synapse.transport.passthru.PassThroughHttpSender.invoke(PassThroughHttpSender.java:266) 
    at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442) 
    at org.apache.synapse.core.axis2.Axis2Sender.sendBack(Axis2Sender.java:230) 
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send(Axis2SynapseEnvironment.java:531) 
    at org.apache.synapse.mediators.builtin.SendMediator.mediate(SendMediator.java:118) 
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:97) 
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:59) 
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158) 
    at org.apache.synapse.rest.Resource.process(Resource.java:343) 
    at org.apache.synapse.rest.API.process(API.java:338) 
    at org.apache.synapse.rest.RESTRequestHandler.apiProcess(RESTRequestHandler.java:123) 
    at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:101) 
    at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:56) 
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:304) 
    at org.apache.synapse.mediators.builtin.LoopBackMediator.mediate(LoopBackMediator.java:63) 
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:97) 
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:59) 
    at org.apache.synapse.config.xml.AnonymousListMediator.mediate(AnonymousListMediator.java:37) 
    at org.apache.synapse.config.xml.SwitchCase.mediate(SwitchCase.java:69) 
    at org.apache.synapse.mediators.filters.SwitchMediator.mediate(SwitchMediator.java:148) 
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:97) 
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:260) 
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.mediateFromContinuationStateStack(Axis2SynapseEnvironment.java:775) 
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:282) 
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:554) 
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:188) 
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) 
    at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:262) 
    at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

API内容:

<payloadFactory media-type="xml"> 
        <format> 
        <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> 
         <soapenv:Body> 
          <ns:binary xmlns:ns="http://ws.apache.org/commons/ns/payload">$1</ns:binary> 
         </soapenv:Body> 
        </soapenv:Envelope> 
        </format> 
        <args> 
        <arg evaluator="xml" expression="//*[local-name()='Binary']/text()"/> 
        </args> 
       </payloadFactory> 
       <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/> 
       <property name="ContentType" value="application/pdf" scope="axis2" type="STRING"/> 
       <property name="messageType" value="application/pdf" scope="axis2" type="STRING"/> 
       <respond/> 

私は、オンラインツールを使用してPDFにバイナリに変換しようとしていると、それが正常に動作します。

+0

実際に何を達成しようとしていますか?着信メッセージとは何ですか? – simar

+0

どのようなシナリオですか?あなたは、esbサービスがpdfファイルでポストhttpリクエストを受け取り、soapレスポンスでbase64エンコードコンテンツで応答しますか? – simar

+0

こんにちは、お返事ありがとうございます。私のシナリオは、バイナリとしてpdfファイルをdbに保存し、ブラウザでpdfファイルを読み込み可能なファイルとして再度取得することでした。 –

答えて

2

最終的にどのように行うかを調べてください。

私は実験でpostgresを使用します。ファイルの内容を格納するテーブルを作成しましょう。それはかなり簡単です。とにかく2件あります。ファイルは、base64またはblob(postgresのbytea)として格納されます。 ファイルがbase64形式の文字列としてデータベースに格納されている場合を実装しました。

drop table if exists pdf_files ; 
create table pdf_files(
    id serial primary key, 
    file_name text, 
    pdf_base64 text, 
    pdf_binary bytea 
); 

データファイルの内容をbase64形式で表に挿入します。 base64形式で ファイルは、ここでは、オンラインで変換することができたり、他のオンラインツール http://www.motobit.com/util/base64-decoder-encoder.asp

insert into pdf_files(file_name, pdf_base64) 
values('title.pdf', 'JVBERi0x.....................NjMKJSVFT0YK'); 

は今、バイナリフィールドが

update pdf_files set pdf_binary = decode(pdf_base64, 'base64'); 

埋まる私は、データベースにこれを得たことができます:

Table content

まず、私はpdfに反応する石鹸サービスを実装しようとしました。

<proxy xmlns="http://ws.apache.org/ns/synapse" name="Sample" startOnLoad="true" statistics="disable" trace="disable" transports="http,https"> 
    <target> 
     <inSequence> 
      <dblookup> 
       <connection> 
        <pool> 
         <dsName>pgConn</dsName> 
        </pool> 
       </connection> 
       <statement> 
        <sql>select pdf_base64 from pdf_files where id = ?</sql> 
        <parameter xmlns:nb="http://mru" expression="//nb:id" type="INTEGER"/> 
        <result column="pdf_base64" name="pdf_base64"/> 
       </statement> 
      </dblookup> 
      <payloadFactory media-type="xml"> 
       <format> 
        <ns:binary xmlns:ns="http://ws.apache.org/commons/ns/payload">$1</ns:binary> 
       </format> 
       <args> 
        <arg evaluator="xml" expression="get-property('pdf_base64')"/> 
       </args> 
      </payloadFactory> 
      <loopback/> 
     </inSequence> 
     <outSequence> 
      <script language="js"> 
      var binaryNode = mc.getEnvelope().getBody().getFirstElement().getFirstOMChild(); 
      binaryNode.setBinary(true); 
      </script> 
      <property name="messageType" scope="axis2" type="STRING" value="application/pdf"/> 
      <respond/> 
     </outSequence> 
    </target> 
    <description/> 
</proxy> 

それはテーブルID(主キー)を参照されたタグIDを要求受け入れ

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:nb="http://mru"> 
    <soap:Body> 
     <nb:id>1</nb:id> 
    </soap:Body> 
</soap:Envelope> 

(私は要求がファイルに保存されているとのカールを使用して要求を作ってみましょう:私が作ったサービスが あり私は

を得たものrequest.xml)

curl -v -X POST -H "Content-Type:text/xml" -d @./request.xml http://localhost:8280/services/Sample.SampleHttpSoap12Endpoint > title1.pdf 

この

サービスから返されたpdfファイルを開くことができます。

今APIと同じです。それは実際には簡単でほぼ同じです。 SQLクエリーのパラメータIDをキャッチするためにurl-templateを構成するだけです。

<api xmlns="http://ws.apache.org/ns/synapse" name="GetPdf" context="/pdf"> 
    <resource methods="GET" uri-template="/id/{fileId}"> 
     <inSequence> 
     <property name="ID" expression="get-property('uri.var.fileId')"/> 
     <dblookup> 
      <connection><pool><dsName>pgConn</dsName></pool></connection> 
      <statement> 
       <sql>select pdf_base64 from pdf_files where id = ?</sql> 
       <parameter expression="get-property('ID')" type="INTEGER"/> 
       <result name="pdf_base64" column="pdf_base64"/> 
      </statement> 
     </dblookup> 
     <payloadFactory media-type="xml"> 
      <format> 
       <ns:binary xmlns:ns="http://ws.apache.org/commons/ns/payload">$1</ns:binary> 
      </format> 
      <args> 
       <arg evaluator="xml" expression="get-property('pdf_base64')"/> 
      </args> 
     </payloadFactory> 
     <loopback/> 
     </inSequence> 
     <outSequence> 
     <script language="js"> 
      var binaryNode = mc.getEnvelope().getBody().getFirstElement().getFirstOMChild();  
      binaryNode.setBinary(true); 
     </script> 
     <property name="messageType" value="application/pdf" scope="axis2" type="STRING"/> 
     <respond/> 
     </outSequence> 
    </resource> 
</api> 

このapiは、適切なContent-Typeヘッダーを使用してPDFファイルを返しますので、ブラウザはそれを理解します。

画像は下にあります。ブラウザはコンテンツタイプヘッダーを使用してコンテンツを適切に識別し、pdfレンダラーを組み込み、wsoesbサーバーが提供するpdfファイルを表示します。

PDF File opened in browser

+0

あなたの時間と労力のためにおかげでsimar。 –

関連する問題