Java 如何使用cxf消息创建和发送apache cxf SoapMessage?

Java 如何使用cxf消息创建和发送apache cxf SoapMessage?,java,spring,apache,web-services,cxf,Java,Spring,Apache,Web Services,Cxf,我正在使用IntellijIDEA,我有一个测试SOAP WS的项目。我有用于发送的xml和msg文件。如何将此文件强制转换为cxf消息和cxf SoapMessage以进行发送?这是我的方法,它返回SoapMessage: public SoapMessage getMessage(File file) throws Exception{ Message msg; msg.setContent(File.class, file); SoapMessage message = new So

我正在使用IntellijIDEA,我有一个测试SOAP WS的项目。我有用于发送的xml和msg文件。如何将此文件强制转换为cxf消息和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>

它用于将my*.msg文件强制转换为SoapMessage并将其发送到SOAPWS中,您可以通过两种方式测试基于SOAP的web服务

  • 使用SOAPUI客户端-这将很容易
  • 我们可以使用Maven插件生成java代码,并开始使用主类中的服务
  • 使用Java的wsimport命令

    wsimport-keep

  • 使用obj调用适当的方法


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

    我需要做一些类似的工作,下面是我所做的:

    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));
        }
    }
    
    import static org.hamcrest.CoreMatchers.is;
    导入静态org.junit.Assert.assertThat;
    导入java.util.List;
    导入org.apache.cxf.binding.soap.Soap12;
    导入org.apache.cxf.binding.soap.SoapMessage;
    导入org.apache.cxf.headers.Header;
    导入org.junit.Before;
    导入org.junit.Test;
    导入org.junit.runner.RunWith;
    导入org.junit.runners.BlockJUnit4ClassRunner;
    导入org.w3c.dom.Element;
    导入org.w3c.dom.Node;
    @RunWith(BlockJUnit4ClassRunner.class)
    公共类SOAPMessageTest{
    @试验
    public void emptyHeaderTest(){
    SoapMessage SoapMessage=新的SoapMessage(Soap12.getInstance());
    List headers=soapMessage.getHeaders();
    断言(headers.size(),为(0));
    }
    }
    

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

    是否尝试像这样实例化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);
    

    看看你的代码。您需要初始化msg。@rghome初始化msg的正确性如何?非常感谢您的回复,但我需要根据需求规范使用cxf消息和cxf SoapMessage
    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));
        }
    }
    
    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);