【问题标题】:Extracting whole SOAP message with JAX-WS使用 JAX-WS 提取整个 SOAP 消息
【发布时间】:2012-10-30 21:39:39
【问题描述】:

我有一个 EJB 无状态 bean Web 服务,并且想要访问整个 SOAP 消息,而不仅仅是我目前在参数中获取的 SOAP 主体。我想将消息提交到不同的组件。我使用的是 Spring 配置,但不是 Spring-WS。我按照本教程进行操作:

http://java.dzone.com/articles/creating-soap-message-handlers

按原样,目前没有进行任何更改。它只记录 SOAP 消息。没有调用 handleMessage()。

@Stateless
@WebService(portName = "XRequest_PortType", serviceName = "XRequestService", endpointInterface = "XRequestPortType")
@Addressing(enabled = true)
@HandlerChain(file = "LogMessage_handler.xml")
@Interceptors(SpringBeanAutowiringInterceptor.class)
public class XRequest_PortTypeWS implements
        XRequestPortType {
...}

LogMessage_handler.xml 与教程略有不同,但我尝试了两种方式:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<javaee:handler-chains 
     xmlns:javaee="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <javaee:handler-chain>
    <javaee:handler>
      <javaee:handler-class>com.test.ws.LogMessageHandle</javaee:handler-class>
    </javaee:handler>
  </javaee:handler-chain>
</javaee:handler-chains>

LogMessageHandler:

package com.test.ws;

import java.io.IOException;
import java.util.Collections;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

/**
 * 
 * @author meerasubbarao
 */
public class LogMessageHandler implements SOAPHandler<SOAPMessageContext> {

    public boolean handleMessage(SOAPMessageContext messageContext) {
        log(messageContext);
        return true;

    }

    public Set<QName> getHeaders() {
        return Collections.EMPTY_SET;
    }

    public boolean handleFault(SOAPMessageContext messageContext) {
        return true;
    }

    public void close(MessageContext context) {
    }

    private void log(SOAPMessageContext messageContext) {
        SOAPMessage msg = messageContext.getMessage(); // Line 1
        try {
            msg.writeTo(System.out); // Line 3
        } catch (SOAPException ex) {
            Logger.getLogger(LogMessageHandler.class.getName()).log(
                    Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(LogMessageHandler.class.getName()).log(
                    Level.SEVERE, null, ex);
        }
    }

}

这甚至是获取整个 SOAP 消息的最佳方式吗?我仍然需要从 XRequest_PortTypeWS 调用 Spring bean 来发送 SOAP 消息。

【问题讨论】:

    标签: java web-services spring soap ejb


    【解决方案1】:

    我已经查看了http://java.dzone.com/articles/creating-soap-message-handlers 中的文章 我注意到您没有在 LogMessage_handler.xml 中设置处理程序名称 还有一件更重要的事情是在同一个包中找到 LogMessage_handler.xml Web 服务 bean。也请在 webservice bean 中添加@Remote 注解。

    【讨论】:

    • 我添加了处理程序名称,就像在教程中一样。我还遵循了另一个教程,该教程的设置就像我列出的那样,所以两种方法都不起作用。该接口来自我正在使用的 API。
    【解决方案2】:

    我确实使用了 SOAP 处理程序并且能够获得完整的 SOAP 消息。详细信息在此其他帖子中。

    Sending Object from SOAP Handler to Web Service

    【讨论】:

      猜你喜欢
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2016-08-23
      • 1970-01-01
      相关资源
      最近更新 更多