5

所以这里是这样的场景:我们有 PeopleSoft,想从 salesforce 来回发送消息。不幸的是,PeopleSoft 没有像 wsimport 这样使用 wsdl 并为您生成类的工具。有些东西会消耗 wsdl,但它所做的一切都是生成存根消息对象。开发人员仍然需要编写代码来手动生成 xml 消息字符串。

我显然不想做所有这些。所以我知道可以从 PeopleSoft 中调用 java。我也知道我可以只使用生成的类来发送消息,但我想使用 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 处理程序应用拦截器模式。处理程序类将在 handleMessage(SOAPMessageContext mc) 方法中截获消息,对 SOAP Envelope 的 XML 主体做任何你想做的事情。并停止 SOAPMessage 进一步处理。

然后,您可以随意处理 XML(例如通过 peoplesoft 机制发送)。当响应从peoplesoft返回时,绕过出站处理程序链......(我真的必须看看如何绕过一个链)。我只是在滚动这个想法,您必须进行 POC。我从来没有这样做过,否则我会共享代码。但这绝对是可行的。

于 2012-02-07T08:34:52.187 回答
1

解决方案之一可能是替换SocketFatoryJAX-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 回答
1

当您说您只需要 XML 时,您是在谈论 SOAP 消息还是只是请求/响应类型?我不确定您是否在谈论第二种情况,但如果您只想要 XML,为什么不直接使用 JAXB?

如果是这种情况,您可以从 WSDL 中提取模式,生成您的类型(假设您有 RequestA 和 ResponseA 用于 WSDL 中的操作“A”)并使用 JAXB 的编组器/解组器来序列化/解析 XML。然后通过您想要的协议发送它。

于 2012-02-08T14:42:34.417 回答