是否可以使用jax-ws生成xml,但不能将其发送出去

时间:2012-02-02 22:44:00

标签: java web-services jax-ws peoplesoft

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

我显然不想做所有这些。所以我知道java可以在PeopleSoft中调用。我也知道我可以使用生成的类发送消息,但我想使用PeopleSoft内置的消息监视功能。

所以我想到的一个可能的解决方案是:

  1. 在java中调用webservice方法(不发送消息)
  2. 抓住xml
  3. 通过peoplesoft机制发送xml
  4. 抓住响应xml
  5. 将响应xml传递回响应java类
  6. 使用java类来获取xml
  7. 中的值

    我疯了还是可能?

    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);
        }
    }
    
    }
    

3 个答案:

答案 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 。然后通过您想要的协议发送它。