SoapAction header missing when using CXF

cxf, java, jax-ws, web-services

Solution

None of this is CXF specific. It is all standard JAX-WS.

You can use the action property of the @WebMethod annotation to set a SOAP action. For example

@WebMethod(operationName = "TestOperation", action="http://example.org/TestOperation")

If you are using wsimport to generate artifacts from the WSDL, you should already have this set in your @WebService annotated interface.

Problem

I have a WSDL file from outside WS that i'm connecting to. And I'm trying to get it working with CXF (works fine with JAX-WS). But I'm getting error from other system. So I decided to take a look at data we're sending to that system and only diffrence is that CXF sets empty SOAPAction http header. I took some reading and looks like only known solutions is pointing to WSDL directly. But I already did that. Anyone has a clue about this? ``` <bean id="object" class="xxx.XxxObject" factory-bean="objectFActory" factory-method="create"/> <bean id="objectFActory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> <property name="serviceClass" value="xxx.XxxObject"/> <property name="wsdlLocation" value="http://blebleble"/> <property name="address" value="http://blebleble"/> <property name="username" value="user"/> <property name="password" value="password"/> <property name="properties"> <map> <entry key="javax.xml.ws.session.maintain" value-type="java.lang.Boolean" value="true"/> </map> </property> </bean> ``` Headers: ``` POST /somepath HTTP/1.1 Content-Type: text/xml; charset=UTF-8 Accept: */* Authorization: Basic <randomhex> SOAPAction: "" User-Agent: Apache CXF 2.7.6 Cache-Control: no-cache Pragma: no-cache Host: somehost:8080 Connection: keep-alive Content-Length: 2791 ```

Original source