2012-02-02 1 views
4

これはシナリオです: 私たちはPeopleSoftを持っており、salesforceからメッセージを前後に送信したいと考えています。残念ながら、PeopleSoftにはwsdlを使用してクラスを生成するwsimportのようなツールはありません。 wsdlを消費するものがありますが、それはすべてスタブメッセージオブジェクトを生成します。開発者はxmlメッセージ文字列を手動で生成するコードを書く必要があります。xmlを生成するのにjax-wsを使用できますか?

私は明らかにそのすべてをしたくありません。ですから、JavaはPeopleSoft内から呼び出すことができます。また、生成されたクラスを使用してメッセージを送信することもできますが、PeopleSoftに組み込まれているメッセージ監視機能を使用したいと考えています。

だから私は意志を考えています可能な解決策:(メッセージを送信せずに)

  1. コールJavaでWebサービスメソッド
  2. グラブXML
  3. は、PeopleSoftの機構を介してXMLを送信
  4. レスポンスXMLを取得する
  5. 応答XMLクラスを応答Javaクラスに戻す
  6. Javaクラスを使用してgraを使用するb値はxml内

私は夢中ですか?

p.s.私は初心者のJava開発者です

ここでは、XMLを取得するための私のハンドラクラスですが、メッセージが送信されないようにする必要があります。

public class LoggingHandler implements SOAPHandler<SOAPMessageContext> { 
// change this to redirect output if desired 
private static PrintStream out = System.out; 
private String xmlOut = null; 

public Set<QName> getHeaders() { 
    return null; 
} 

public boolean handleMessage(SOAPMessageContext smc) { 
    logToSystemOut(smc); 
    return true; 
} 

public boolean handleFault(SOAPMessageContext smc) { 
    logToSystemOut(smc); 
    return true; 
} 

// nothing to clean up 
public void close(MessageContext messageContext) { 
} 

public String getXmlOut() { 
    return xmlOut; 
} 

/* 
* Check the MESSAGE_OUTBOUND_PROPERTY in the context 
* to see if this is an outgoing or incoming message. 
* Write a brief message to the print stream and 
* output the message. The writeTo() method can throw 
* SOAPException or IOException 
*/ 
private void logToSystemOut(SOAPMessageContext smc) { 
    Boolean outboundProperty = (Boolean) 
     smc.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY); 


    SOAPMessage message = smc.getMessage(); 
    try { 
     ByteArrayOutputStream baOut = new ByteArrayOutputStream(); 
     message.writeTo(baOut); 
     xmlOut = new String(baOut.toByteArray()); 


    } catch (Exception e) { 
     out.println("Exception in handler: " + e); 
    } 
} 

} 

答えて

1

解決策の1つは、JAX-WSのSocketFatoryを置き換えることです。大雑把には、次のようになります。

javax.net.SocketFactory socketFactory = new MySocketFactory(); 
Service service = Service.create(new URL(wsdl), new QName(namespace, servicename)); 
Dispatch<SOAPMessage> dispatch = service.createDispatch(methodToBeCalled, SOAPMessage.class, Service.Mode.MESSAGE); 
dispatch.getRequestContext().put(com.sun.xml.ws.developer.JAXWSProperties.SSL_SOCKET_FACTORY, socketFactory); 
// or ((BindingProvider) Service.getPort(SEIInterface.class)).getRequestContext().put(...); 

そしてMySocketFactoryに、あなたはその別のチャネルへのパイプメッセージを意志のソケットを作成するのは自由です。

2

JAX-WSのJava Webサービスでは、系統的な方法があります。 SOAPハンドラを使用してインターセプタパターンを適用するだけです。ハンドラクラスはhandleMessage(SOAPMessageContext mc)メソッドのメッセージを傍受し、SOAP EnvelopeのXML本体で何をしたいかを行います。さらにSOAPMessageの処理を停止します。

次に、XMLを好きなように扱うことができます(peoplesoftの仕組みを使って送信するなど)。応答がpeoplesoftから戻ってきたら、アウトバウンド・ハンドラ・チェーンをバイパスしてください...(実際にチェーンを通す方法を見なければなりません)。私はちょうどアイデアをロールオーバーしている、あなたはPOCを作る必要があります。私はそうしなかった、そうでなければ私は共有コードを持っていただろう。しかし、これは絶対に実行可能です。

+0

新しいWebサービスエンドポイントを作成する場合は、SEIはより抽象度の高いものであり、生成されたXMLを処理するため、SEI JAX-WSメカニズムの代わりにプロバイダベースのメカニズムを使用します。 –

+0

私は、例を見てハンドラクラスを実装しましたが、それ以降の処理からどのようにしてSOAPメッセージを止めることができないのか分かりません。それについてのヒント? 私のハンドラクラスは次のとおりです。 'public boolean handleMessage(SOAPMessageContext smc){ logToSystemOut(smc); がtrueを返します。 } プライベートvoid logToSystemOut(SOAPMessageContext smc){ SOAPMessage message = smc.getMessage(); try { ByteArrayOutputStream baOut = new ByteArrayOutputStream(); message.writeTo(baOut); xmlOut = new String(baOut.toByteArray()); } } – willard

+0

1. SalesForceによって公開されているPeopleSoftからサービスを呼び出していると思います。したがって、クライアントサイドでHandlerを定義する必要があります。これは、クライアントサイドのランタイムが生成するSOAPメッセージを傍受したいからです(PeopleSoftのメカニズムを経由することができるように)。ハンドラを定義した方法は、サーバ側でハンドラを定義するために使用されます。クライアントサイドハンドラは、別々に定義されています。アイデアを得るにはhttp://bit.ly/zGermlを参照してください。 –

1

あなたはXMLだけが必要だと言うとき、あなたはSOAPメッセージまたは要求/応答タイプについて話していますか?私はあなたが2番目のケースについて話しているのかどうかはわかりませんが、XMLだけが必要な場合は、JAXBを直接使用しないのはなぜですか?

この場合、WSDLからスキーマを抽出し、型を生成します(WSDLの操作 "A"に対してRequestAとResponseAを持っているとします)。JAXBのmarshaller/unmarshallerを使用してXML。それからあなたが望むプロトコルを通してそれを送ります。

+0

JAXBを直接使用すると、メッセージのXML表現だけでなく完全なSOAPメッセージも必要であるため、サービスエンドポイントが理解できるようになります。また、JAX-WSランタイムこれを行うと、ホイールを再発明するのではなく、私たちがそれを探索/再利用すべきではありません。 –

関連する問題