5

シナリオは次のとおりです。PeopleSoftがあり、セールスフォースとの間でメッセージをやり取りしたいと考えています。残念ながら、PeopleSoftには、wsdlを使用してクラスを生成するwsimportのようなツールがありません。wsdlを消費するものがありますが、それはすべてスタブメッセージオブジェクトを生成します。開発者は、xmlメッセージ文字列を手動で生成するためのコードを作成する必要があります。

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

だから私が考えている可能な解決策は:

  1. Javaでwebserviceメソッドを呼び出します(メッセージを送信せずに)
  2. xmlを取得します
  3. peoplesoftメカニズムを介してxmlを送信します
  4. 応答xmlを取得します
  5. 応答xmlを応答javaクラスに戻します
  6. Javaクラスを使用してxml内の値を取得します

私は夢中ですか、それともこれは可能ですか?

ps私は初心者の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);
    }
}

}
4

3 に答える 3

2

Java Web サービスである JAX-WS には、これを体系的に行う方法があります。SOAP Handler を使用してインターセプター パターンを適用するだけです。ハンドラー クラスは、handleMessage(SOAPMessageContext mc) メソッドでメッセージをインターセプトし、SOAP Envelope の XML 本体でやりたいことを何でも行います。SOAPMessage の以降の処理を停止します。

次に、XML を好きなように処理できます (例: peoplesoft メカニズムを介して送信)。そして、応答が peoplesoft から戻ってきたら、アウトバウンド ハンドラー チェーンをバイパスします ... (チェーンをバイパスする方法を実際に確認する必要があります)。私はアイデアを展開しているだけです。POCを作成する必要があります。そうしないと、コードを共有することになります。しかし、これは絶対に実行可能です。

于 2012-02-07T08:34:52.187 に答える
1

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

その場合、WSDL からスキーマを抽出し、型を生成し (WSDL の操作「A」に対して RequestA と ResponseA があるとします)、JAXB のマーシャラー/アンマーシャラーを使用して XML をシリアル化/解析することができます。次に、必要なプロトコルを介して送信します。

于 2012-02-08T14:42:34.417 に答える
1

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

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、メッセージを別のチャネルにパイプするソケットを自由に作成できます。

于 2012-02-03T00:14:58.547 に答える