所以这是场景: 我们有PeopleSoft,并希望从salesforce来回发送消息。不幸的是,PeopleSoft没有像wsimport这样的工具,它使用wsdl并为你生成类。有些东西会消耗wsdl,但它会生成存根消息对象。开发人员仍然必须编写代码来手动生成xml消息字符串。
我显然不想做所有这些。所以我知道java可以在PeopleSoft中调用。我也知道我可以使用生成的类发送消息,但我想使用PeopleSoft内置的消息监视功能。
所以我想到的一个可能的解决方案是:
我疯了还是可能?
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);
}
}
}
答案 0 :(得分:2)
在Java Web服务JAX-WS中有一种系统的方法。只需使用SOAP Handler应用拦截器模式。处理程序类将拦截handleMessage(SOAPMessageContext mc)方法中的消息,对SOAP Envelope的XML主体执行任何操作。并停止SOAPMessage的进一步处理。
然后,您可以根据需要处理XML(例如通过peoplesoft机制发送)。当来自peoplesoft的响应回来时,绕过出站处理程序链......(我真的必须通过传递链来看看如何)。我只是在想这个想法,你必须做POC。我从来没有这样做过,否则我会分享代码。但这绝对可行。
答案 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 :(得分:1)
当您说您只需要XML时,您是在谈论SOAP消息还是仅仅是请求/响应类型?我不确定你是否在讨论第二种情况,但如果你只想要XML,为什么不直接使用JAXB呢?
如果是这种情况,您可以从WSDL中提取模式,生成您的类型(假设您有WSA中的操作“A”的RequestA和ResponseA)并使用JAXB的marshaller / unmarshaller来序列化/解析XML 。然后通过您想要的协议发送它。