【问题标题】:How to create and send apache cxf SoapMessage with cxf Messgae?如何使用 cxf 消息创建和发送 apache cxf SoapMessage?
【发布时间】:2015-05-05 08:01:22
【问题描述】:

我正在使用 IntellijIDEA,并且我有测试 SOAP WS 的项目。我有用于发送的 xml 和 msg 文件。如何将此文件转换为 cxf Message 和 cxf SoapMessage 进行发送?这是我的方法,它返回 SoapMessage:

public SoapMessage getMessage(File file) throws Exception{
 Message msg;
 msg.setContent(File.class, file);
 SoapMessage message = new SoapMessage(msg);
 return message;
}

但是如果我尝试调用这个方法,我会看到:

java.lang.NullPointerException

我尝试发送此消息:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
schemaLocation="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
    <Test>
      <msg>Test</msg>
    </Test>
</soapenv:Body>
</soapenv:Envelope>

更新: 需要什么消息初始化?

Message msg = new Message(){...}?

它用于将我的 *.msg 文件转换为 SoapMessage 并将其发送到 SOAP WS

【问题讨论】:

  • 看看你的代码。您需要初始化 msg。
  • @rghome 如何正确初始化 msg?

标签: java spring apache web-services cxf


【解决方案1】:

测试基于 SOAP 的 Web 服务的两种方法

  1. 使用 SOAP UI 客户端 - 很容易
  2. 我们可以使用 Maven 插件生成 java 代码并开始使用主类中的服务。
  3. 使用Java的wsimport命令

    wsimport -keep http://localhost:9090/ws/hello?wsdl

    URL url = new URL("http://localhost:9090/ws/hello?wsdl");
    //1st argument service URI, refer to wsdl document above
    //2nd argument is service name, refer to wsdl document above
    QName qname = new QName("http://ws.service.com/", "HelloWorldImplService");
    Service service = Service.create(url, qname);
    
    HelloWorld hellObj = service.getPort(HelloWorld.class);
    

使用 obj 调用适当的方法。

我们不需要手动构造 SOAP 消息。

【讨论】:

  • 非常感谢您的回复,但是我需要按照需求规范来使用cxf Message和cxf SoapMessage
【解决方案2】:

我需要做类似的事情,这就是我所做的:

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import java.util.List;

import org.apache.cxf.binding.soap.Soap12;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

@RunWith(BlockJUnit4ClassRunner.class)
public class SOAPMessageTest {

    @Test
    public void emptyHeaderTest() {
        SoapMessage soapMessage = new SoapMessage(Soap12.getInstance());

        List<Header> headers = soapMessage.getHeaders();
        assertThat(headers.size(), is(0));
    }
}

根据需要调整此代码以将内容添加到soapMessage 对象。

【讨论】:

    【解决方案3】:

    您是否尝试过像这样实例化一个soapMessage?

    Reader reader = new StringReader(body);
        XMLStreamReader xmlReader = null;
        XMLInputFactory factory = XMLInputFactory.newInstance(); // Or newFactory()
        try {
          xmlReader = factory.createXMLStreamReader(reader);
        } catch (XMLStreamException e) {
          e.printStackTrace();
        }
    
        SoapMessage soapMessage = new SoapMessage(Soap11.getInstance());
        soapMessage.setContent(XMLStreamReader.class, xmlReader);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多