Hello

Is it possible to get JAX-WS + Aegis + MTOM working? So far I was unable to achieve such configuration. Example (as a client I used SoapUI 2.0.2):

WEB-INF/web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd";>
        <servlet>
                <servlet-name>CXFServlet</servlet-name>
                
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
                <load-on-startup>1</load-on-startup>
        </servlet>

        <servlet-mapping>
                <servlet-name>CXFServlet</servlet-name>
                <url-pattern>/*</url-pattern>
        </servlet-mapping>
</web-app>


test.MtomService:

@WebService
public interface MtomService
{
public int addResource(@WebParam(name="resource") @XmlMimeType("application/octet-stream") DataHandler resource);
}


test.MtomServiceImpl:

@WebService (endpointInterface="test.MtomService")
public class MtomServiceImpl implements MtomService
{
        public int addResource(DataHandler resource)
        {
                try
                {
                        return resource.getInputStream().available();
                }
                catch (IOException e)
                {
                        return -1;
                }
        }
}


cxf.xml:

<beans xmlns="http://www.springframework.org/schema/beans"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:jaxws="http://cxf.apache.org/jaxws"; xmlns:soap="http://cxf.apache.org/bindings/soap"; xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd";>

        <import resource="classpath:META-INF/cxf/cxf.xml" />
        <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
        <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
        
<bean id="aegisDatabinding" class="org.apache.cxf.aegis.databinding.AegisDatabinding" scope="prototype"/>
        
<bean id="serviceFactory" class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean" scope="prototype">
                <property name="dataBinding" ref="aegisDatabinding"/>
        </bean>

        <bean id="testService" class="test.MtomServiceImpl"/>
        
<jaxws:server id="testServiceEndpoint" serviceBean="#testService" serviceClass="test.MtomServiceImpl" address="/TestService">
                <jaxws:serviceFactory>
                        <ref bean="serviceFactory"/>
                </jaxws:serviceFactory>
                <jaxws:binding>
                        <soap:soapBinding version="1.2"/>
                </jaxws:binding>
                <jaxws:properties>
                        <entry key="mtom-enabled" value="true"/>
                </jaxws:properties>
        </jaxws:server>
</beans>


Request:

MIME-Version: 1.0
Host: localhost:8080
Content-Length: 23944
User-Agent: Jakarta Commons-HttpClient/3.0.1
Content-Type: multipart/related; type="application/xop+xml"; start="<[EMAIL PROTECTED]>"; start-info="application/soap+xml; action=\"\""; boundary="----=_Part_2_1187418.1216278505717"

------=_Part_2_1187418.1216278505717
Content-Type: application/xop+xml; charset=UTF-8; type="application/soap+xml; action=\"addResource\""
Content-Transfer-Encoding: 8bit
Content-ID: <[EMAIL PROTECTED]>

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"; xmlns:test="http://test/";>
   <soap:Header/>
   <soap:Body>
      <test:addResource>
         <!--Optional:-->
<resource><inc:Include href="cid:870601276765" xmlns:inc="http://www.w3.org/2004/08/xop/include"/></resource>
      </test:addResource>
   </soap:Body>
</soap:Envelope>
------=_Part_2_1187418.1216278505717
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
Content-ID: <870601276765>

<binary data here>

------=_Part_2_1187418.1216278505717--


Response:

HTTP/1.1 500 Internal Server Error
Date: Thu, 17 Jul 2008 07:08:26 GMT
Content-Length: 322
Connection: close
Content-Type: application/soap+xml;charset=UTF-8
X-Powered-By: Servlet 2.4; JBoss-4.0.4.GA (build: CVSTag=JBoss_4_0_4_GA date=200605151000)/Tomcat-5.5
Server: Apache-Coyote/1.1

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope";><soap:Body><soap:Fault><soap:Code><soap:Value>soap:Sender</soap:Value></soap:Code><soap:Reason><soap:Text xml:lang ="en">Unexpected element: {http://www.w3.org/2004/08/xop/include}Include</soap:Text></soap:Reason></soap:Fault></soap:Body></soap:Envelope>


An exception thrown on a server:

Caused by: org.apache.cxf.aegis.DatabindingException: Unexpected element: {http://www.w3.org/2004/08/xop/include}Include at org.apache.cxf.aegis.type.basic.Base64Type.readObject(Base64Type.java:74) at org.apache.cxf.aegis.type.mtom.AbstractXOPType.readObject(AbstractXOPType.java:127) at org.apache.cxf.aegis.AegisXMLStreamDataReader.read(AegisXMLStreamDataReader.java:82) at org.apache.cxf.aegis.databinding.XMLStreamDataReader.read(XMLStreamDataReader.java:47)
        ... 30 more


So it looks like CXF (Aegis) for some reason isn't prepared to handle MTOM (XOP) request. If I switch to the (default) JAXB binding everything works:

cxf.xml:

<beans xmlns="http://www.springframework.org/schema/beans";
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
        xmlns:jaxws="http://cxf.apache.org/jaxws";
        xmlns:soap="http://cxf.apache.org/bindings/soap";
        xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                http://cxf.apache.org/jaxws 
http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd";>

        <import resource="classpath:META-INF/cxf/cxf.xml" />
        <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
        <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
        
        <bean id="testService" class="test.MtomServiceImpl"/>
        
<jaxws:server id="testServiceEndpoint" serviceBean="#testService" serviceClass="test.MtomServiceImpl" address="/TestService">
                <jaxws:binding>
                        <soap:soapBinding version="1.2"/>
                </jaxws:binding>
                <jaxws:properties>
                        <entry key="mtom-enabled" value="true"/>
                </jaxws:properties>
        </jaxws:server>
</beans>


Request:

The same as above, just different id in _Part.


Response:

HTTP/1.1 200 OK
Date: Thu, 17 Jul 2008 07:12:33 GMT
Content-Length: 447
Content-Type: multipart/related; type="application/xop+xml"; boundary="----=_Part_0_16585987.1216278753892"; start="<[EMAIL PROTECTED]>"; start-info="application/soap+xml" X-Powered-By: Servlet 2.4; JBoss-4.0.4.GA (build: CVSTag=JBoss_4_0_4_GA date=200605151000)/Tomcat-5.5
Server: Apache-Coyote/1.1

------=_Part_0_16585987.1216278753892
Content-Type: application/xop+xml; charset=UTF-8; type="application/soap+xml";
Content-Transfer-Encoding: binary
Content-ID: <[EMAIL PROTECTED]>

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope";><soap:Body><ns2:addResourceResponse xmlns:ns2="http://test/";><return>23188</return></ns2:addResourceResponse></soap:Body></soap:Envelope>
------=_Part_0_16585987.1216278753892--


Do I need an additional configuration to use MTOM with Aegis?

CXF 2.1.1.

Reply via email to