Tag: CXF

Apache CXF Service with Complex Type in JBoss AS7

Hi,

JBoss AS7 uses the JBossWS-CXF as default webservice provider which provides most of the features coming with Apache CXF (including WS-Security, WS-Policy, WS-Addressing, WS-ReliableMessaging, basic WS-Trust, MTOM) as well as common JBossWS stack features like endpoint metrics, record management, endpoint address rewrite, etc.

In this example we will see how we can use a Complex DataType inside our CXF Based WebService and how we can enable the client side Logging for the incoming and outgoing SOAP Request/Responses, which are most desired for trouble shooting and debugging purpose.

In this example we will mainly focus on following points

Point-1). How to use the JBoss Specific Tools to build the WebServices. The details of these tools like “wsconsume” and “wsprovide” are mentioned in the following link: https://docs.jboss.org/author/display/JBWS/JAX-WS+Tools

Point-2). Where we need to place the “log4j.properties fileat the client side in order to generate a separate Log file containing the SOAP request/response.

Point-3). How to use “org.apache.cxf.interceptor.LoggingInInterceptor” and “org.apache.cxf.interceptor.LoggingOutInterceptor” at client side.

Point-4). Here we are using JBoss AS7.1.0 CR1b which can be downloaded from the following link: http://www.jboss.org/jbossas/downloads. I am using “jboss-as-7.1.0.CR1bb” in this demo.

Point-5). How to use the JAXB Annotations like “XmlAccessorType”, “XmlAccessType” and “XmlType” to define and use the Complex Datatypes inside our webservice using the “SOAPBinding.ParameterStyle.BARE”

Point-6). Source Code of this Demo is available at https://github.com/jaysensharma/MiddlewareMagicDemos

Developing Simple WebService

Step-1). Create a directory somewhere in your file system as “/home/userone/ComplexTypes_CXF_WebService_JBossAS7” then create another directory “src” inside the “/home/userone/ComplexTypes_CXF_WebService_JBossAS7”.

Step-2). Write a simple webservice implementation pojo class “DemoCXF.java” as following inside the directory “/home/userone/ComplexTypes_CXF_WebService_JBossAS7/src”:

package ws;
import javax.jws.WebParam;
import javax.jws.WebMethod;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

@WebService(name = "DemoCXF", serviceName ="DemoCXFService", portName ="DemoCXFPort", targetNamespace="http://test.org")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) 

public class DemoCXF
{
  @WebMethod()
  @WebResult(targetNamespace="http://test.org",name="updatedEmployee")
  public Employee processEmployeeSalary(@WebParam(partName = "employee", name = "employee", targetNamespace = "http://test.org")
        Employee emp, @WebParam(partName = "incrementAmount", name = "incrementAmount", targetNamespace = "http://test.org") Long incrementAmount)
  {
    System.out.println("[DemoCXF] Method Invoked....processEmployeeSalary");
    System.out.println("[DemoCXF] Before processing: "+emp);
    long incrementedSalary=emp.getEmpSalary()+incrementAmount;
    emp.setEmpSalary(incrementedSalary);
    System.out.println("[DemoCXF] After processing: "+emp);

    // Some Business Logic to Store the Employee's Updated Details in Database or Messaging System.

    return emp;
  }
}

Step-3). Write a simple Complex Type “Employee.java” as following inside the directory “/home/userone/ComplexTypes_CXF_WebService_JBossAS7/src”:

package ws;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "employee", propOrder = {
    "empName",
    "empNo",
    "empSalary"
})

public class Employee
  {
    public String empName;
    public Long empNo;
    public Long empSalary;

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String value) {
        this.empName = value;
    }

    public Long getEmpNo() {
        return empNo;
    }

    public void setEmpNo(Long value) {
        this.empNo = value;
    }

    public Long getEmpSalary() {
        return empSalary;
    }

    public void setEmpSalary(Long value) {
        this.empSalary = value;
    }

  }

Step-4). Write the “web.xml” file to define the WebService as following inside the directory “/home/userone/ComplexTypes_CXF_WebService_JBossAS7/src”

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <servlet> 
    <servlet-name>DemoCXF</servlet-name>  
    <servlet-class>ws.DemoCXF</servlet-class>  
  </servlet>  

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

Step-5). Write the WebService client code “Test_CXF_Client.java” as following inside the directory “/home/userone/ComplexTypes_CXF_WebService_JBossAS7/src”:

package client;
import java.net.URL;
import javax.xml.namespace.QName;

// Client side Logging related CXF APIs
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;

public class Test_CXF_Client
  {
     public static void main(String ar[]) throws Exception
      {
        String WSDL_URL=ar[0]+"?wsdl";
        DemoCXFService service=new DemoCXFService(new URL(WSDL_URL));
        DemoCXF port=service.getDemoCXFPort();

        /* Following part of code is needed for client side Logging of Soap request/response */
        /* We need to make sure that we place the "log4j.properties" file inside clients classpath */
        Client client = ClientProxy.getClient(port);
        client.getInInterceptors().add(new LoggingInInterceptor());
        client.getOutInterceptors().add(new LoggingOutInterceptor());


        Employee emp=new Employee();
        emp.setEmpNo(1000L);
        emp.setEmpName("MiddlewaremagicEmployee");
        emp.setEmpSalary(6000L);

        System.out.println("nnBefore  EmpNo: "+emp.getEmpNo()+",  Name:"+emp.getEmpName()+",  Sal:"+emp.getEmpSalary());
        emp=port.processEmployeeSalary(emp,1000L);
        System.out.println("nnAfter   EmpNo: "+emp.getEmpNo()+",  Name:"+emp.getEmpName()+",  Sal:"+emp.getEmpSalary());
      }
  }

Step-5). As we are going to generate the client side logging in a separate log file at client side using CXF APIs so we will need to write a “log4j.properties” file as following inside the directory “/home/userone/ComplexTypes_CXF_WebService_JBossAS7/src”:

# Direct log messages to a log file
log4j.rootLogger=INFO, WSClientAppender

log4j.appender.WSClientAppender=org.apache.log4j.ConsoleAppender
log4j.appender.WSClientAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.WSClientAppender.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

NOTE: In this example we are using the “ConsoleAppender” whihc means in the Clients Console (Shell Pormpt) we will be able to see the Incoming and Outgoing soap request/response.

Step-6). Now we will write simple ANT build script “build.xml” which will build / deploy and run the webservice & client as following inside the directory “/home/userone/ComplexTypes_CXF_WebService_JBossAS7”:

<project name="JBoss_Complex_Service" default="deploy">
<property name="jboss.home" value="/home/userone/jboss-as-7.1.0.CR1b" />
<property name="jboss.module.dir" value="${jboss.home}/modules" />

<property name="basedir" value="." />
<property name="war.dir" value="CXFComplexTypeDemoWAR" />
<property name="war.name" value="CXFComplexTypeDemo.war" />
<property name="src.dir" value="src" />
<property name="client.src.dir" value="${basedir}/clientSrc" />
<property name="output.dir" value="build" />
<property name="client.dir" value="${basedir}/clientStuff" />
<property name="client.jar.name" value="DemoCXFClient.jar" />
 
   <path id="jboss.classpath">
     <fileset dir="${jboss.module.dir}">
        <include name="**/*.jar"/>
     </fileset>  
   </path>

   <path id="client.classpath">
     <fileset dir="${jboss.module.dir}">
        <include name="**/*.jar"/>
     </fileset>  
     <fileset dir="${client.dir}">
        <include name="*.jar"/>
     </fileset>  
   </path>

   <taskdef name="wsprovide" classname="org.jboss.ws.tools.ant.WSProvideTask">
       <classpath refid="jboss.classpath"/>
   </taskdef>

   <taskdef name="wsconsume" classname="org.jboss.ws.tools.ant.WSConsumeTask">
       <classpath refid="jboss.classpath"/>
   </taskdef>

        <target name="init">
           <delete dir="${output.dir}" />
           <mkdir dir="${output.dir}" />
           <mkdir dir="${output.dir}/${war.dir}"/>
           <mkdir dir="${output.dir}/${war.dir}/META-INF"/>
           <mkdir dir="${output.dir}/${war.dir}/WEB-INF"/>
           <mkdir dir="${output.dir}/${war.dir}/WEB-INF/classes"/>
           <delete dir="${client.dir}" />
           <mkdir dir="${client.dir}/META-INF"/>
        </target>
	 
    <target name="build" depends="init">
       <javac srcdir="${src.dir}" destdir="${output.dir}/${war.dir}/WEB-INF/classes"  includes="*.java" excludes="Test_CXF_Client.java" classpathref="jboss.classpath"/>
        <copy todir="${output.dir}/${war.dir}/WEB-INF">
	  <fileset dir="${basedir}/src">
	      <include name="web.xml"/>
	  </fileset>
	</copy>   
       <wsprovide
        	fork="false"
        	keep="true"
        	destdir="${output.dir}"
        	resourcedestdir="${output.dir}/${war.dir}/WEB-INF/wsdl"
        	sourcedestdir="${output.dir}"
        	genwsdl="true" 
        	verbose="true"
        	sei="ws.DemoCXF">
            	<classpath>
                	  <pathelement path="${output.dir}/${war.dir}/WEB-INF/classes"/>
            	</classpath>
      </wsprovide>

      <jar jarfile="${output.dir}/${war.name}" basedir="${output.dir}/${war.dir}" compress="true" /> 
      
    </target>

        <target name="deploy" depends="build">
            <echo message="*******************  Deploying   *********************" />  
            <echo message="********** ${war.name} to ${jboss.home}/standalone/deployments **********" />  
            <copy file="${output.dir}/${war.name}" todir="${jboss.home}/standalone/deployments/"/>

            <echo message="*******************  Deployed Successfully   *********************" />  
        </target>
  
        <target name="post-deploy" >
            <echo message="*******************  NOTE  *********************" />
            <echo message="***** You should be able to access your WSDL using Browser now *****" />
            <echo message="                http://localhost:8080/CXFComplexTypeDemo?wsdl          " />
        </target>  

        <target name="client" depends="post-deploy">
           <delete dir="${client.dir}" />
           <mkdir dir="${client.dir}"/>             
             <wsconsume
                      fork="true"
                      keep="true"
                      destdir="${client.dir}"
                      sourcedestdir="${client.dir}"
                      package="client"
                      wsdlLocation="service.wsdl"
                      wsdl="http://localhost:8080/CXFComplexTypeDemo?wsdl">
            </wsconsume>

            <!-- We need to make sure that log4j.properties is present inside client's classpath-->
            <copy file="${src.dir}/log4j.properties" todir="${client.dir}" />

            <javac srcdir="${src.dir}" destdir="${client.dir}"  includes="Test_CXF_Client.java" classpathref="client.classpath">
	        <classpath>
	            <pathelement location="${client.dir}"/>
	            <path refid="client.classpath"/>
	        </classpath>
            </javac>

            <jar jarfile="${client.dir}/${client.jar.name}" basedir="${client.dir}" compress="true" /> 

            <!-- Cleaning Client Stuff Directory  --> 
            <delete dir="${client.dir}/client"/>
            <delete file="${client.dir}/log4j.properties"/> 
       </target>

        <target name="run" depends="client">
            <java classname="client.Test_CXF_Client" fork="true" >
	        <classpath>
	            <pathelement location="${client.dir}/DemoCXFClient.jar"/>
	            <path refid="client.classpath"/>
	        </classpath>
                <arg value="http://localhost:8080/CXFComplexTypeDemo"/>
            </java>
        </target>  

</project>

NOTE: The only change in the above file you need to do is to change the “jboss.home” directory path in the second line of the above script to point to your own JBoss AS7 directory.

Point-7). Now Start your JBoss Profile as following from inside the directory “/home/userone/jboss-as-7.1.0.CR1b/bin”:

.
 ./standalone.sh -c standalone-full.xml
.

Step-8). Now before running your ANT script to build and deploy the above webapplication you should have the ANT as well as JAVA set in the $PATH variable of the Shell / command prompt as following:

For Unix Based OS:
export PATH=/home/userone/jdk1.6.0_21/bin:/home/userone/org.apache.ant_1.6.5/bin:$PATH

For Windows Based OS:
set PATH=C:/jdk1.6.0_21/bin;C:/org.apache.ant_1.6.5/bin;%PATH%

Step-9). Now once the PATH is set In the command/Shell prompt you can move inside the directory “/home/userone/ComplexTypes_CXF_WebService_JBossAS7” and then run the ant to build and deploy the WebService application on your JBoss Standalone full profile, by running the command “ant deploy”

[userone@localhost ComplexTypes_CXF_WebService_JBossAS7]$ ant deploy
Buildfile: build.xml

init:
   [delete] Deleting directory /home/userone/ComplexTypes_CXF_WebService_JBossAS7/build
    [mkdir] Created dir: /home/userone/ComplexTypes_CXF_WebService_JBossAS7/build
    [mkdir] Created dir: /home/userone/ComplexTypes_CXF_WebService_JBossAS7/build/CXFComplexTypeDemoWAR
    [mkdir] Created dir: /home/userone/ComplexTypes_CXF_WebService_JBossAS7/build/CXFComplexTypeDemoWAR/META-INF
    [mkdir] Created dir: /home/userone/ComplexTypes_CXF_WebService_JBossAS7/build/CXFComplexTypeDemoWAR/WEB-INF
    [mkdir] Created dir: /home/userone/ComplexTypes_CXF_WebService_JBossAS7/build/CXFComplexTypeDemoWAR/WEB-INF/classes
   [delete] Deleting directory /home/userone/ComplexTypes_CXF_WebService_JBossAS7/clientStuff
    [mkdir] Created dir: /home/userone/ComplexTypes_CXF_WebService_JBossAS7/clientStuff/META-INF

build:
    [javac] Compiling 2 source files to /home/userone/ComplexTypes_CXF_WebService_JBossAS7/build/CXFComplexTypeDemoWAR/WEB-INF/classes
     [copy] Copying 1 file to /home/userone/ComplexTypes_CXF_WebService_JBossAS7/build/CXFComplexTypeDemoWAR/WEB-INF
[wsprovide] Generating from endpoint: ws.DemoCXF
[wsprovide] log4j:WARN No appenders could be found for logger (org.apache.cxf.common.logging.LogUtils).
[wsprovide] log4j:WARN Please initialize the log4j system properly.
[wsprovide] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[wsprovide] java2ws -s /home/userone/ComplexTypes_CXF_WebService_JBossAS7/build -classdir /home/userone/ComplexTypes_CXF_WebService_JBossAS7/build -d /home/userone/ComplexTypes_CXF_WebService_JBossAS7/build/CXFComplexTypeDemoWAR/WEB-INF/wsdl -verbose -wsdl -cp ::::::::: -wrapperbean -createxsdimports ws.DemoCXF
[wsprovide] java2ws - Apache CXF 2.4.4
[wsprovide] 
      [jar] Building jar: /home/userone/ComplexTypes_CXF_WebService_JBossAS7/build/CXFComplexTypeDemo.war

deploy:
     [echo] *******************  Deploying   *********************
     [echo] ********** CXFComplexTypeDemo.war to /home/userone/jboss-as-7.1.0.CR1b/standalone/deployments **********
     [copy] Copying 1 file to /home/userone/jboss-as-7.1.0.CR1b/standalone/deployments
     [echo] *******************  Deployed Successfully   *********************

BUILD SUCCESSFUL
Total time: 5 seconds

As soon as the WebService will be deployed on the JBoss AS7 you will see the following kind of output on your JBoss Console (STDOUT):

15:53:37,164 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-2) Starting deployment of "CXFComplexTypeDemo.war"
15:53:37,203 INFO  [org.jboss.wsf.stack.cxf.metadata.MetadataBuilder] (MSC service thread 1-5) Add Service
 id=DemoCXF
 address=http://localhost:8080/CXFComplexTypeDemo
 implementor=ws.DemoCXF
 invoker=org.jboss.wsf.stack.cxf.JBossWSInvoker
 serviceName={http://test.org}DemoCXFService
 portName={http://test.org}DemoCXFPort
 wsdlLocation=null
 mtomEnabled=false
15:53:37,204 INFO  [org.jboss.ws.common.management.DefaultEndpointRegistry] (MSC service thread 1-5) register: jboss.ws:context=CXFComplexTypeDemo,endpoint=DemoCXF
15:53:37,213 INFO  [org.apache.cxf.service.factory.ReflectionServiceFactoryBean] (MSC service thread 1-5) Creating Service {http://test.org}DemoCXFService from class ws.DemoCXF
15:53:37,238 INFO  [org.apache.cxf.endpoint.ServerImpl] (MSC service thread 1-5) Setting the server's publish address to be http://localhost:8080/CXFComplexTypeDemo
15:53:37,247 INFO  [org.jboss.wsf.stack.cxf.deployment.WSDLFilePublisher] (MSC service thread 1-5) WSDL published to: file:/home/userone/jboss-as-7.1.0.CR1b/standalone/data/wsdl/CXFComplexTypeDemo.war/DemoCXFService.wsdl
15:53:37,251 INFO  [org.jboss.as.webservices] (MSC service thread 1-8) JBAS015539: Starting service jboss.ws.endpoint."CXFComplexTypeDemo.war".DemoCXF
15:53:37,260 INFO  [org.jboss.web] (MSC service thread 1-8) registering web context: /CXFComplexTypeDemo
15:53:37,268 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS018565: Replaced deployment "CXFComplexTypeDemo.war" with deployment "CXFComplexTypeDemo.war"

Step-10). Now we will try to compile and run the WebService Client application by running the command “ant run”

[userone@localhost ComplexTypes_CXF_WebService_JBossAS7]$ ant run
Buildfile: build.xml

post-deploy:
     [echo] *******************  NOTE  *********************
     [echo] ***** You should be able to access your WSDL using Browser now *****
     [echo]                 http://localhost:8080/CXFComplexTypeDemo?wsdl          

client:
   [delete] Deleting directory /home/userone/ComplexTypes_CXF_WebService_JBossAS7/clientStuff
    [mkdir] Created dir: /home/userone/ComplexTypes_CXF_WebService_JBossAS7/clientStuff
[wsconsume] Consuming wsdl: http://localhost:8080/CXFComplexTypeDemo?wsdl
[wsconsume] log4j:WARN No appenders could be found for logger (org.apache.cxf.common.logging.LogUtils).
[wsconsume] log4j:WARN Please initialize the log4j system properly.
[wsconsume] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
     [copy] Copying 1 file to /home/userone/ComplexTypes_CXF_WebService_JBossAS7/clientStuff
    [javac] Compiling 1 source file to /home/userone/ComplexTypes_CXF_WebService_JBossAS7/clientStuff
      [jar] Building jar: /home/userone/ComplexTypes_CXF_WebService_JBossAS7/clientStuff/DemoCXFClient.jar
   [delete] Deleting directory /home/userone/ComplexTypes_CXF_WebService_JBossAS7/clientStuff/client
   [delete] Deleting: /home/userone/ComplexTypes_CXF_WebService_JBossAS7/clientStuff/log4j.properties

run:
      Feb 4, 2012 3:54:51 PM client.DemoCXFService <clinit>
      INFO: Can not initialize the default wsdl from service.wsdl
      15:54:52,844  INFO ReflectionServiceFactoryBean:366 - Creating Service {http://test.org}DemoCXFService from WSDL: http://localhost:8080/CXFComplexTypeDemo?wsdl
      
      
      Before  EmpNo: 1000,  Name:MiddlewaremagicEmployee,  Sal:6000
      15:54:53,275  INFO LoggingOutInterceptor:151 - Outbound Message
      ---------------------------
      ID: 1
      Address: http://localhost:8080/CXFComplexTypeDemo
      Encoding: UTF-8
      Content-Type: text/xml
      Headers: {Accept=[*/*], SOAPAction=[""]}
      Payload: 
            <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
             <soap:Body>
                  <ns2:employee xmlns:ns2="http://test.org">
                      <empName>MiddlewaremagicEmployee</empName>
                      <empNo>1000</empNo>
                      <empSalary>6000</empSalary>
                  </ns2:employee>
                  <ns2:incrementAmount xmlns:ns2="http://test.org">1000</ns2:incrementAmount>
              </soap:Body>
            </soap:Envelope>
      --------------------------------------
      15:54:53,289  INFO LoggingInInterceptor:151 - Inbound Message
      ----------------------------
      ID: 1
      Response-Code: 200
      Encoding: UTF-8
      Content-Type: text/xml;charset=UTF-8
      Headers: {Content-Length=[268], content-type=, Date=[Sat, 04 Feb 2012 10:24:52 GMT], Server=[Apache-Coyote/1.1]}
      Payload: 
            <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
               <soap:Body>
                  <ns2:updatedEmployee xmlns:ns2="http://test.org">
                      <empName>MiddlewaremagicEmployee</empName>
                      <empNo>1000</empNo>
                      <empSalary>7000</empSalary>
                  </ns2:updatedEmployee>
               </soap:Body>
            </soap:Envelope>
      --------------------------------------
      
      
      After   EmpNo: 1000,  Name:MiddlewaremagicEmployee,  Sal:7000

BUILD SUCCESSFUL
Total time: 9 seconds

Step-11). The Generated WSDL File will look something like following :
http://localhost:8080/CXFComplexTypeDemo?wsdl

<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions name="DemoCXFService" targetNamespace="http://test.org" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://test.org" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <wsdl:types>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://test.org" xmlns="http://test.org" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="employee">
    <xs:sequence>
      <xs:element minOccurs="0" name="empName" type="xs:string"/>
      <xs:element minOccurs="0" name="empNo" type="xs:long"/>
      <xs:element minOccurs="0" name="empSalary" type="xs:long"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="employee" nillable="true" type="employee"/>
  <xs:element name="incrementAmount" nillable="true" type="xs:long"/>
  <xs:element name="updatedEmployee" nillable="true" type="employee"/>
</xs:schema>
  </wsdl:types>
  <wsdl:message name="processEmployeeSalaryResponse">
    <wsdl:part element="tns:updatedEmployee" name="updatedEmployee">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="processEmployeeSalary">
    <wsdl:part element="tns:employee" name="employee">
    </wsdl:part>
    <wsdl:part element="tns:incrementAmount" name="incrementAmount">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="DemoCXF">
    <wsdl:operation name="processEmployeeSalary">
      <wsdl:input message="tns:processEmployeeSalary" name="processEmployeeSalary">
    </wsdl:input>
      <wsdl:output message="tns:processEmployeeSalaryResponse" name="processEmployeeSalaryResponse">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="DemoCXFServiceSoapBinding" type="tns:DemoCXF">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="processEmployeeSalary">
      <soap:operation soapAction="" style="document"/>
      <wsdl:input name="processEmployeeSalary">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="processEmployeeSalaryResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="DemoCXFService">
    <wsdl:port binding="tns:DemoCXFServiceSoapBinding" name="DemoCXFPort">
      <soap:address location="http://localhost:8080/CXFComplexTypeDemo"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

.
.
Thanks :)
Middleware Magic Team


Apache CXF Client Side Logging in JBoss AS7

Hi,

JBoss AS7 uses the JBossWS-CXF as default webservice provider which provides most of the features coming with Apache CXF (including WS-Security, WS-Policy, WS-Addressing, WS-ReliableMessaging, basic WS-Trust, MTOM) as well as common JBossWS stack features like endpoint metrics, record management, endpoint address rewrite, etc.

In this example we will see how we can enable the client side Logging for the incoming and outgoing SOAP Request/Responses, which are most desired for trouble shooting and debugging purpose.

In this example we will mainly focus on following points

Point-1). How to use the JBoss Specific Tools to build the WebServices. The details of these tools like “wsconsume” and “wsprovide” are mentioned in the following link: https://docs.jboss.org/author/display/JBWS/JAX-WS+Tools

Point-2). Where we need to place the “log4j.properties fileat the client side in order to generate a separate Log file containing the SOAP request/response.

Point-3). How to use “org.apache.cxf.interceptor.LoggingInInterceptor” and “org.apache.cxf.interceptor.LoggingOutInterceptor” at client side.

Point-4). Here we are using JBoss AS7.1.0 CR1b which can be downloaded from the following link: http://www.jboss.org/jbossas/downloads. I am using “jboss-as-7.1.0.CR1b” in this demo.

Point-5). Source Code of this Demo is available at https://github.com/jaysensharma/MiddlewareMagicDemos

Developing Simple WebService

Step-1). Create a directory somewhere in your file system as “/home/userone/CXFClientSide_Logging_Demo” then create another directory “src” inside the “/home/userone/CXFClientSide_Logging_Demo”.

Step-2). Write a simple webservice implementation pojo class “DemoCXF.java” as following inside the directory “/home/userone/CXFClientSide_Logging_Demo/src”:


package ws;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.annotation.Resource;
import javax.xml.ws.WebServiceContext;
import java.util.Collection;

@WebService(name = "DemoCXF", serviceName ="DemoCXFService", portName ="DemoCXFPort", targetNamespace="http://test.org")

public class DemoCXF
{
  @Resource
  WebServiceContext ctx;

  @WebMethod()
  public String sayHello(String name)
  {
    System.out.println("nnt Method Invoked....String sayHello("+name+")");
    return "Hello JBossAS7 User: "+name;
  }

  @WebMethod()
  public String getProperty(String propertyName)
  {
    System.out.println("nnt Method Invoked....String getProperty(String propertyName)");
    return "RETURNED: "+(Collection) ctx.getMessageContext().values();
  }
}

Step-3). Write the “web.xml” file to define the WebService as following inside the directory “/home/userone/CXFClientSide_Logging_Demo/src”:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <servlet> 
    <servlet-name>DemoCXF</servlet-name>  
    <servlet-class>ws.DemoCXF</servlet-class>  
  </servlet>  

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

Step-4). Write the WebService client code “Test_CXF_Client.java” as following inside the directory “/home/userone/CXFClientSide_Logging_Demo/src”:


package client;
import java.net.URL;
import javax.xml.namespace.QName;

// Client side Logging related CXF APIs 
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;

public class Test_CXF_Client
  {
     public static void main(String ar[]) throws Exception
      {
        String WSDL_URL=ar[0]+"?wsdl";
        DemoCXFService service=new DemoCXFService(new URL(WSDL_URL));
        DemoCXF port=service.getDemoCXFPort();

        /* Following part of code is needed for client side Logging of Soap request/response */
        /* We need to make sure that we place the "log4j.properties" file inside clients classpath */
        Client client = ClientProxy.getClient(port);
        client.getInInterceptors().add(new LoggingInInterceptor());
        client.getOutInterceptors().add(new LoggingOutInterceptor()); 

         
        System.out.println("nt port.sayHello("MiddlewareMagic") = "+port.sayHello("MiddlewareMagic"));
      }
  }

Step-5). As we are going to generate the client side logging in a separate log file at client side using CXF APIs so we will need to write a “log4j.properties” file as following inside the directory “/home/userone/CXFClientSide_Logging_Demo/src”:

# Direct log messages to a log file
log4j.rootLogger=INFO, WSClientAppender


log4j.appender.WSClientAppender=org.apache.log4j.RollingFileAppender
log4j.appender.WSClientAppender.File=/NotBackedUp/Downloads/CXFClientDemo/clientStuff/webserviceClient.log
log4j.appender.WSClientAppender.MaxFileSize=10MB
log4j.appender.WSClientAppender.MaxBackupIndex=3
log4j.appender.WSClientAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.WSClientAppender.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

NOTE: Make sure that you have defined the right Location for the Log File and the Directory must exist, which is defined in the above file property “log4j.appender.WSClientAppender.File”.

Step-6). Now we will write simple ANT build script “build.xml” which will build / deploy and run the webservice & client as following inside the directory “/home/userone/CXFClientSide_Logging_Demo”:

<project name="JBoss_Service" default="deploy">
<property name="jboss.home" value="/home/userone/jboss-as-7.1.0.CR1b" />
<property name="jboss.module.dir" value="${jboss.home}/modules" />

<property name="basedir" value="." />
<property name="war.dir" value="CXFClientLoggingDemoWAR" />
<property name="war.name" value="CXFClientLoggingDemo.war" />
<property name="src.dir" value="src" />
<property name="client.src.dir" value="${basedir}/clientSrc" />
<property name="output.dir" value="build" />
<property name="client.dir" value="${basedir}/clientStuff" />
<property name="client.jar.name" value="DemoCXFClient.jar" />
 
   <path id="jboss.classpath">
     <fileset dir="${jboss.module.dir}">
        <include name="**/*.jar"/>
     </fileset>  
   </path>

   <path id="client.classpath">
     <fileset dir="${jboss.module.dir}">
        <include name="**/*.jar"/>
     </fileset>  
     <fileset dir="${client.dir}">
        <include name="*.jar"/>
     </fileset>  
   </path>

   <taskdef name="wsprovide" classname="org.jboss.ws.tools.ant.WSProvideTask">
       <classpath refid="jboss.classpath"/>
   </taskdef>

   <taskdef name="wsconsume" classname="org.jboss.ws.tools.ant.WSConsumeTask">
       <classpath refid="jboss.classpath"/>
   </taskdef>

        <target name="init">
           <delete dir="${output.dir}" />
           <mkdir dir="${output.dir}" />
           <mkdir dir="${output.dir}/${war.dir}"/>
           <mkdir dir="${output.dir}/${war.dir}/META-INF"/>
           <mkdir dir="${output.dir}/${war.dir}/WEB-INF"/>
           <mkdir dir="${output.dir}/${war.dir}/WEB-INF/classes"/>
           <delete dir="${client.dir}" />
           <mkdir dir="${client.dir}/META-INF"/>
        </target>
	 
    <target name="build" depends="init">
       <javac srcdir="${src.dir}" destdir="${output.dir}/${war.dir}/WEB-INF/classes"  includes="*.java" excludes="Test_CXF_Client.java" classpathref="jboss.classpath"/>
        <copy todir="${output.dir}/${war.dir}/WEB-INF">
	  <fileset dir="${basedir}/src">
	      <include name="web.xml"/>
	  </fileset>
	</copy>   
       <wsprovide
        	fork="false"
        	keep="true"
        	destdir="${output.dir}"
        	resourcedestdir="${output.dir}/${war.dir}/WEB-INF/wsdl"
        	sourcedestdir="${output.dir}"
        	genwsdl="true" 
        	verbose="true"
        	sei="ws.DemoCXF">
            	<classpath>
                	  <pathelement path="${output.dir}/${war.dir}/WEB-INF/classes"/>
            	</classpath>
      </wsprovide>

      <jar jarfile="${output.dir}/${war.name}" basedir="${output.dir}/${war.dir}" compress="true" /> 
      
    </target>

        <target name="deploy" depends="build">
            <echo message="*******************  Deploying   *********************" />  
            <echo message="********** ${war.name} to ${jboss.home}/standalone/deployments **********" />  
            <copy file="${output.dir}/${war.name}" todir="${jboss.home}/standalone/deployments/"/>

            <echo message="*******************  Deployed Successfully   *********************" />  
        </target>
  
        <target name="post-deploy" >
            <echo message="*******************  NOTE  *********************" />
            <echo message="***** You should be able to access your WSDL using Browser now *****" />
            <echo message="                http://localhost:8080/CXFClientLoggingDemo?wsdl          " />
        </target>  

        <target name="client" depends="post-deploy">
           <delete dir="${client.dir}" />
           <mkdir dir="${client.dir}"/>             
             <wsconsume
                      fork="true"
                      keep="true"
                      destdir="${client.dir}"
                      sourcedestdir="${client.dir}"
                      package="client"
                      wsdlLocation="service.wsdl"
                      wsdl="http://localhost:8080/CXFClientLoggingDemo?wsdl">
            </wsconsume>


            <!-- We need to make sure that log4j.properties is present inside client's classpath-->
            <copy file="${src.dir}/log4j.properties" todir="${client.dir}" />

            <javac srcdir="${src.dir}" destdir="${client.dir}"  includes="Test_CXF_Client.java" classpathref="client.classpath">
	        <classpath>
	            <pathelement location="${client.dir}"/>
	            <path refid="client.classpath"/>
	        </classpath>
            </javac>

            <jar jarfile="${client.dir}/${client.jar.name}" basedir="${client.dir}" compress="true" /> 


            <!-- Cleaning Client Stuff Directory --> 
            <delete dir="${client.dir}/client"/> 
            <delete file="${client.dir}/log4j.properties"/> 
       </target>

        <target name="run" depends="client">
            <java classname="client.Test_CXF_Client" fork="true" >
	        <classpath>
	            <pathelement location="${client.dir}/DemoCXFClient.jar"/>
	            <path refid="client.classpath"/>
	        </classpath>
                <jvmarg value="-Dorg.apache.cxf.Logger=org.apache.cxf.common.logging.Log4jLogger" />
                <arg value="http://localhost:8080/CXFClientLoggingDemo"/>
            </java>
        </target>  

</project>

NOTE: The only change in the above file you need to do is to change the “jboss.home” directory path in the second line of the above script to point to your own JBoss AS7 directory.

Step-7). Now Start your JBoss Profile as following from inside the directory “/home/userone/jboss-as-7.1.0.CR1/bin”:

.
 ./standalone.sh -c standalone-full.xml
.

Step-8). Now before running your ANT script to build and deploy the above webapplication you should have the ANT as well as JAVA set in the $PATH variable of the Shell / command prompt as following:

For Unix Based OS:
export PATH=/home/userone/jdk1.6.0_21/bin:/home/userone/org.apache.ant_1.6.5/bin:$PATH

For Windows Based OS:
set PATH=C:/jdk1.6.0_21/bin;C:/org.apache.ant_1.6.5/bin;%PATH%

Step-9). Now once the PATH is set In the command/Shell prompt you can move inside the directory “/home/userone/CXFClientSide_Logging_Demo” and then run the ant to build and deploy the WebService application on your JBoss Standalone full profile, by running the command “ant deploy”

[userone@localhost CXFClientSide_Logging_Demo]$ ant deploy
Buildfile: build.xml

init:
   [delete] Deleting directory /home/userone/CXFClientSide_Logging_Demo/build
    [mkdir] Created dir: /home/userone/CXFClientSide_Logging_Demo/build
    [mkdir] Created dir: /home/userone/CXFClientSide_Logging_Demo/build/CXFClientLoggingDemoWAR
    [mkdir] Created dir: /home/userone/CXFClientSide_Logging_Demo/build/CXFClientLoggingDemoWAR/META-INF
    [mkdir] Created dir: /home/userone/CXFClientSide_Logging_Demo/build/CXFClientLoggingDemoWAR/WEB-INF
    [mkdir] Created dir: /home/userone/CXFClientSide_Logging_Demo/build/CXFClientLoggingDemoWAR/WEB-INF/classes
   [delete] Deleting directory /home/userone/CXFClientSide_Logging_Demo/clientStuff
    [mkdir] Created dir: /home/userone/CXFClientSide_Logging_Demo/clientStuff/META-INF

build:
    [javac] Compiling 1 source file to /home/userone/CXFClientSide_Logging_Demo/build/CXFClientLoggingDemoWAR/WEB-INF/classes
     [copy] Copying 1 file to /home/userone/CXFClientSide_Logging_Demo/build/CXFClientLoggingDemoWAR/WEB-INF
[wsprovide] Generating from endpoint: ws.DemoCXF
[wsprovide] log4j:WARN No appenders could be found for logger (org.apache.cxf.common.logging.LogUtils).
[wsprovide] log4j:WARN Please initialize the log4j system properly.
[wsprovide] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[wsprovide] java2ws -s /home/userone/CXFClientSide_Logging_Demo/build -classdir /home/userone/CXFClientSide_Logging_Demo/build -d /home/userone/CXFClientSide_Logging_Demo/build/CXFClientLoggingDemoWAR/WEB-INF/wsdl -verbose -wsdl -cp ::::::::: -wrapperbean -createxsdimports ws.DemoCXF
[wsprovide] java2ws - Apache CXF 2.4.4
[wsprovide] 
      [jar] Building jar: /home/userone/CXFClientSide_Logging_Demo/build/CXFClientLoggingDemo.war

deploy:
     [echo] *******************  Deploying   *********************
     [echo] ********** CXFClientLoggingDemo.war to /home/userone/jboss-as-7.1.0.CR1b/standalone/deployments **********
     [copy] Copying 1 file to /home/userone/jboss-as-7.1.0.CR1b/standalone/deployments
     [echo] *******************  Deployed Successfully   *********************

BUILD SUCCESSFUL
Total time: 6 seconds

As soon as the WebService will be deployed on the JBoss AS7 you will see the following kind of output on your JBoss Console (STDOUT):

12:55:32,698 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-7) Starting deployment of "CXFClientLoggingDemo.war"
12:55:32,953 INFO  [org.jboss.wsf.stack.cxf.metadata.MetadataBuilder] (MSC service thread 1-2) Add Service
 id=DemoCXF
 address=http://localhost:8080/CXFClientLoggingDemo
 implementor=ws.DemoCXF
 invoker=org.jboss.wsf.stack.cxf.JBossWSInvoker
 serviceName={http://test.org}DemoCXFService
 portName={http://test.org}DemoCXFPort
 wsdlLocation=null
 mtomEnabled=false
12:55:32,954 INFO  [org.jboss.ws.common.management.DefaultEndpointRegistry] (MSC service thread 1-2) register: jboss.ws:context=CXFClientLoggingDemo,endpoint=DemoCXF
12:55:33,174 INFO  [org.apache.cxf.service.factory.ReflectionServiceFactoryBean] (MSC service thread 1-2) Creating Service {http://test.org}DemoCXFService from class ws.DemoCXF
12:55:33,482 INFO  [org.apache.cxf.endpoint.ServerImpl] (MSC service thread 1-2) Setting the server's publish address to be http://localhost:8080/CXFClientLoggingDemo
12:55:33,605 INFO  [org.jboss.wsf.stack.cxf.deployment.WSDLFilePublisher] (MSC service thread 1-2) WSDL published to: file:/home/userone/jboss-as-7.1.0.CR1b/standalone/data/wsdl/CXFClientLoggingDemo.war/DemoCXFService.wsdl
12:55:33,613 INFO  [org.jboss.as.webservices] (MSC service thread 1-8) JBAS015539: Starting service jboss.ws.port-component-link
12:55:33,622 INFO  [org.jboss.as.webservices] (MSC service thread 1-3) JBAS015539: Starting service jboss.ws.endpoint."CXFClientLoggingDemo.war".DemoCXF
12:55:33,647 INFO  [org.jboss.web] (MSC service thread 1-7) registering web context: /CXFClientLoggingDemo
12:55:33,667 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS018559: Deployed "CXFClientLoggingDemo.war"

Step-10). Now we will try to compile and run the WebService Client application by running the command “ant run”

[userone@localhost CXFClientSide_Logging_Demo]$ ant run
Buildfile: build.xml

post-deploy:
     [echo] *******************  NOTE  *********************
     [echo] ***** You should be able to access your WSDL using Browser now *****
     [echo]                 http://localhost:8080/CXFClientLoggingDemo?wsdl          

client:
   [delete] Deleting directory /home/userone/CXFClientSide_Logging_Demo/clientStuff
    [mkdir] Created dir: /home/userone/CXFClientSide_Logging_Demo/clientStuff
[wsconsume] Consuming wsdl: http://localhost:8080/CXFClientLoggingDemo?wsdl
[wsconsume] log4j:WARN No appenders could be found for logger (org.apache.cxf.common.logging.LogUtils).
[wsconsume] log4j:WARN Please initialize the log4j system properly.
[wsconsume] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
     [copy] Copying 1 file to /home/userone/CXFClientSide_Logging_Demo/clientStuff
    [javac] Compiling 1 source file to /home/userone/CXFClientSide_Logging_Demo/clientStuff
      [jar] Building jar: /home/userone/CXFClientSide_Logging_Demo/clientStuff/DemoCXFClient.jar
   [delete] Deleting directory /home/userone/CXFClientSide_Logging_Demo/clientStuff/client
   [delete] Deleting: /home/userone/CXFClientSide_Logging_Demo/clientStuff/log4j.properties

run:
      Feb 4, 2012 12:55:45 PM client.DemoCXFService <clinit>
      INFO: Can not initialize the default wsdl from service.wsdl
      
      	 port.sayHello("MiddlewareMagic") = Hello JBossAS7 User: MiddlewareMagic

BUILD SUCCESSFUL
Total time: 9 seconds

Step-11). Once the webservice is invoked successfully then you will be able to see the Client Side log file is generated in the location which is mentioned in the “log4j.properties” file…something like following:

12:55:46,418  INFO ReflectionServiceFactoryBean:366 - Creating Service {http://test.org}DemoCXFService from WSDL: http://localhost:8080/CXFClientLoggingDemo?wsdl
12:55:46,930  INFO LoggingOutInterceptor:151 - Outbound Message
---------------------------
ID: 1
Address: http://localhost:8080/CXFClientLoggingDemo
Encoding: UTF-8
Content-Type: text/xml
Headers: {Accept=[*/*], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:sayHello xmlns:ns2="http://test.org"><arg0>MiddlewareMagic</arg0></ns2:sayHello></soap:Body></soap:Envelope>
--------------------------------------
12:55:47,061  INFO LoggingInInterceptor:151 - Inbound Message
----------------------------
ID: 1
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {Content-Length=[235], content-type=, Date=[Sat, 04 Feb 2012 07:25:46 GMT], Server=[Apache-Coyote/1.1]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:sayHelloResponse xmlns:ns2="http://test.org"><return>Hello JBossAS7 User: MiddlewareMagic</return></ns2:sayHelloResponse></soap:Body></soap:Envelope>
--------------------------------------

Enabling Logging On JBoss Server Side

You can add the following System Property (-Dorg.apache.cxf.logging.enabled=true) on JBoss Configuration like “standalone-full.xml” as following:

<server xmlns="urn:jboss:domain:1.3">

    <extensions>
        <extension module="org.jboss.as.clustering.infinispan"/>
        <extension module="org.jboss.as.cmp"/>
       .
       .
       .
        <extension module="org.jboss.as.webservices"/>
        <extension module="org.jboss.as.weld"/>
    </extensions>

    <system-properties>
        <property name="org.apache.cxf.logging.enabled" value="true"/>
    </system-properties>


    <management>
        <security-realms>
       .
       .
        </security-realms>
   </management>

.
.
Thanks :)
Middleware Magic Team


Sending Attachment using MTOM on spring-cxf webservice in JBoss AS7

Hi,

Awaited “jboss-as-7.1.0.CR1” is released recently. So here we are going to test a WebService to receive an attachment from a WebService client using MTOM in JBoss AS7.1 CR1. In this sample we will see how to develop a Simple Apache CXF based webService with the help of Spring framework and then how to use MTOM (Message Transmission Optimization Mechanism).

Benifit of MTOM? The efficiency claims of MTOM only refers to the size of the messages sent across the wire. Since SOAP uses XML, any binary data in the SOAP message will have to be encoded as text. This is usually done using Base64 encoding which increases the size of the binary data by 33%. MTOM provides a way to send the binary data in its original binary form, avoiding any increase in size due to encoding it in text. MTOM does not address the efficiency of serializing or deserializing the messages. More details about MTOM can be found in the following link: http://en.wikipedia.org/wiki/Message_Transmission_Optimization_Mechanism

More informations about the CXF Spring Client can be found in the following link:
http://cxf.apache.org/docs/writing-a-service-with-spring.html

Highlights of Article

Point-1). In this example we are going to use “jboss-as-7.1.0.CR1” which can be downloaded from the following link: http://www.jboss.org/jbossas/downloads

Point-2). We will see how to use the “cxf-servlet.xml” file and where to place it.

Point-3). How to use the Spring “ApplicationContext” and “ClassPathXmlApplicationContext” to initialize the jaxws based beans for Service client.

Point-4). As the client is going to use spring features to access the web service so we will need to make sure that “spring-2.5.6.jar” jar is present in the client classpath. This jar can be downloaded from the following link:
http://repo1.maven.org/maven2/org/springframework/spring/2.5.6/spring-2.5.6.jar

Point-5). How to send binary attachments to WebService from a Client using MTOM. And How to configure MTOM in our Service and Client communication.

Point-6). Discuss some possible BUGs with the “org.jboss.ws.tools.ant.WSProvideTask” of JBoss AS7.
.

Developing Spring CXF WebService

Step1). Create a Directory somewhere in your filesystem like “/home/userone/Spring_MTOM_Service/” and then create “src” directory inside “/home/userone/Spring_MTOM_Service/”.

Step2). Create a class “Picture.java” using the standard XML binding annotations. And make sure that you define the @javax.xml.bind.annotation.XmlMimeType for your DataHandler. More information about DataHandler can be found in the following link:
http://docs.oracle.com/javase/6/docs/api/javax/activation/DataHandler.html#DataHandler(java.lang.Object, java.lang.String)

package ws;
import javax.activation.DataHandler;
import javax.xml.bind.annotation.XmlMimeType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlAttribute;

@XmlType
public class Picture {

    @XmlMimeType("application/octet-stream")
    protected DataHandler pictureDataHandler;
    protected String title;

  public String getTitle() 
    { 
       return title; 
    }

  public void setTitle(String title) 
    {
       this.title = title; 
    }

  public DataHandler getPictureDataHandler() 
    {
       System.out.println("[Picture] picture = "+this);
       return pictureDataHandler; 
    }
/*
  public void setPictureDataHandler(DataHandler pictureData) 
    { 
       System.out.println("nsetPictureDataHandler() method invoked with pictureData = "+pictureData);
       System.out.println("[Picture] picture = "+this);
       System.out.println("[Picture] pictureData.getContentType() = "+pictureData.getContentType());
       this.pictureDataHandler = pictureDataHandler; 
    }
*/
}

( ( ( ( ( I S S U E – 1 ) ) ) ) ):
If you will notice in above code i have commented the “setPictureDataHandler” method because if i dont comment it then i get the following exception, Which looks like an issue with JBoss AS7.1 CR1 and i get the following exception while running org.jboss.ws.tools.ant.WSProvideTask ANT task:

[wsprovide] Caused by: org.apache.cxf.service.factory.ServiceConstructionException
[wsprovide] 	at org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:292)
[wsprovide] 	at org.apache.cxf.service.factory.AbstractServiceFactoryBean.initializeDataBindings(AbstractServiceFactoryBean.java:86)
[wsprovide] 	at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromClass(ReflectionServiceFactoryBean.java:444)
[wsprovide] 	at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.buildServiceFromClass(JaxWsServiceFactoryBean.java:682)
[wsprovide] 	at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:507)
[wsprovide] 	at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:241)
[wsprovide] 	at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:202)
[wsprovide] 	at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:101)
[wsprovide] 	at org.apache.cxf.frontend.AbstractServiceFactory.createService(AbstractServiceFactory.java:78)
[wsprovide] 	... 26 more
[wsprovide] Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
[wsprovide] Class has two properties of the same name "pictureDataHandler"
[wsprovide] 	this problem is related to the following location:
[wsprovide] 		at public javax.activation.DataHandler ws.Picture.getPictureDataHandler()
[wsprovide] 		at ws.Picture
[wsprovide] 		at private ws.Picture ws.jaxws_asm.UploadPictureAttachment.arg1
[wsprovide] 		at ws.jaxws_asm.UploadPictureAttachment
[wsprovide] 	this problem is related to the following location:
[wsprovide] 		at protected javax.activation.DataHandler ws.Picture.pictureDataHandler
[wsprovide] 		at ws.Picture
[wsprovide] 		at private ws.Picture ws.jaxws_asm.UploadPictureAttachment.arg1
[wsprovide] 		at ws.jaxws_asm.UploadPictureAttachment

( ( ( ( ( I S S U E – 2 ) ) ) ) ):
If i declare the @XmlMimeType(“application/octet-stream”) Just above the method “public DataHandler getPictureDataHandler()” then without having the “setPictureDataHandler” method the code compiles FINE using org.jboss.ws.tools.ant.WSProvideTask ANT task, but in the run time when inside the webservice when i call Picture.getPictureDataHandler() it returns NULL inside “SpringCXFMtom.java” service. Where as the setPictureDataHandler(dataHandler) works fine.

Step3). Now we will write the Web Service Endpoint Interface “SpringCXFMtomIntf.java” inside “/home/userone/Spring_MTOM_Service/src” as following:

package ws;
import javax.jws.WebService;
@WebService
public interface SpringCXFMtomIntf
  {
      public String uploadPictureAttachment(String pictureName,ws.Picture picture);
  }

Step4). Now we will provide the WebService Implementation class “SpringCXFMtom.java” inside “/home/userone/Spring_MTOM_Service/src” as following:

package ws;
import javax.jws.WebService;
import javax.jws.WebMethod;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import javax.activation.DataHandler;
import java.io.IOException;
import java.io.File;
import javax.xml.ws.RequestWrapper;


@WebService(name="SpringCXFMtomService", endpointInterface = "ws.SpringCXFMtomIntf",targetNamespace="http://ws/")
public class SpringCXFMtom implements SpringCXFMtomIntf
  {
      @WebMethod(operationName="uploadPictureAttachment")
      @RequestWrapper(localName = "uploadPictureAttachment", targetNamespace = "http://ws/", className = "ws.UploadPictureAttachment")
      public String uploadPictureAttachment(String pictureName,ws.Picture picture)
        {
            String uploadLocation=System.getProperty("jboss.server.log.dir");
            byte b[];
            FileOutputStream fout=null;
            InputStream in = null;
            try{
                  System.out.println("[SpringCXFMtom] uploadPictureAttachment() invoked.");
                  System.out.println("[SpringCXFMtom] picture = "+picture);
                  picture.setTitle(pictureName);
                  System.out.println("picture.getTitle() = "+picture.getTitle());
                  System.out.println("trying to get dataHandler");
                  DataHandler dataHandler=picture.getPictureDataHandler();

                  if(dataHandler!=null)
                    {
                        System.out.println("Got dataHandler: "+dataHandler);

  	                in = dataHandler.getInputStream();
	                if(in != null) 
                          {
                             System.out.println("InputStream NOT NULL");
                             File file=new File(uploadLocation+"/"+pictureName);
                             fout=new FileOutputStream(file);

                             int n=0;
                             while((n=in.read())!=-1)
                               {
                                    fout.write(n);
                               }
                             fout.close();
                             in.close();
	                  }
                       else
                         {
                             System.out.println("InputStream IS NULL");
                         }                             
                    }
                   else
                     {
                         System.out.println("nnPlease check Why the dataHandler is NULL.");
                     }
               }
             catch(Exception e)
               {
                   System.out.println("nt Unable to Upload File on directory: "+uploadLocation+"/"+pictureName);
                   e.printStackTrace();
                   if(in!=null)
                     {
                        try{   in.close(); }catch(Exception ee){ ee.printStackTrace(); }
                     }
                   if(fout!=null)
                     {
                        try{   fout.close(); }catch(Exception ee){ ee.printStackTrace(); }
                     }
               }
                       
            return "File Uploaded on JBoss AS7 Server Location: "+uploadLocation+"/"+pictureName;
        }
  }

Step4). We will write the “web.xml” inside “/home/userone/Spring_MTOM_Service/src” as following (practically this file is almost empty):

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

</web-app>

Step5). We will write the “cxf-servlet.xml” inside “/home/userone/Spring_MTOM_Service/src” to define “jaxws:endpoint” and it’s implementation class along with the MTOM enablement details as following:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jaxws="http://cxf.apache.org/jaxws"   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">

       <jaxws:endpoint 
              id="mtomService" 
              implementor="ws.SpringCXFMtom" 
              address="http://localhost:8080/HelloWorld">
              <jaxws:properties>
                     <entry key="mtom-enabled" value="true"/>
              </jaxws:properties>
       </jaxws:endpoint>
 
</beans>

NOTE: We need to make sure that this “cxf-servlet.xml” file is present inside the “WEB-INF” diectory of our service. NOTICE we enabled MTOM using the properties key=”mtom-enabled” value=”true”

Developing Spring CXF based Client

Step6). Now we will write the WebService Client “Test_CXF_Client.java” inside “/home/userone/Spring_MTOM_Service/src” using CXF standard code as following :

package client;
import java.util.Date;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.*;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
public class Test_CXF_Client
  {
     public static void main(String ar[]) throws Exception
      {
        ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"client-beans.xml"});
        SpringCXFMtomIntf client = (SpringCXFMtomIntf) context.getBean("testClient");
        System.out.println("ntGot Client: "+client);         

        DataHandler dataHandler=null;
        String attachmentName=ar[0];
        String attachmentFile=ar[1];
        Picture picture=null;

        dataHandler=new DataHandler(new java.net.URL(ar[1]));
        System.out.println("nt dataHandler.getContentType() = "+dataHandler.getContentType());

        picture=new Picture();
        picture.setTitle(attachmentName);        
        picture.setPictureDataHandler(dataHandler);

        String result=client.uploadPictureAttachment(attachmentName,picture);
        System.out.println("ntclient.uploadPictureAttachment(attachmentName,picture): "+result);                
      }
  }

Step7). We will create the “client-beans.xml” XML file inside “/home/userone/Spring_MTOM_Service/src” directory as following. (This file name may be anything)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:jaxws="http://cxf.apache.org/jaxws"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">

    <jaxws:client id="testClient"
                  serviceClass="client.SpringCXFMtomIntf"
                  address="http://localhost:8080/Spring_CXF_MTOM_Service_Demo/SpringCXFMtom">
                  <jaxws:properties>
                     <entry key="mtom-enabled" value="true"/>
                  </jaxws:properties>
    </jaxws:client>
</beans>

NOTE: The file name “client-beans.xml” may be anything but we need to make sure that this file is present in the client classpath.

NOTE: client-beans.xml file should be written only when you have run the wsconsume anttask to generate Client side artifacts for your WebService, Because the classes like “client.SpringCXFServiceIntf” will be generated at client side only after generating the client side artifacts.

NOTE: We enabled MTOM using the properties key=”mtom-enabled” value=”true”

Step8). As our weservice client is going to use the spring features to access the web service so we will need to make sure that the following JAR is present in the client classpath and place it inside “/home/userone/Spring_MTOM_Service/src” directory. This file can be downloaded from the following link:
http://repo1.maven.org/maven2/org/springframework/spring/2.5.6/spring-2.5.6.jar

Building, Deploying and Testing

Step9). As everything is done so we will write a ant build script in order to build/deploy/run and test the WebService and Basic Authentication, So create a file “build.xml” inside “/home/userone/Spring_MTOM_Service/” as following:

<project name="JBoss_Service" default="post-deploy">
<property name="jboss.home" value="/home/userone/boss-as-7.1.0.CR1" />
<property name="jboss.module.dir" value="${jboss.home}/modules" />
<property name="basedir" value="." />
<property name="war.tmp.name" value="Spring_CXF_MTOM_Service_Demo" />
<property name="war.name" value="Spring_CXF_MTOM_Service_Demo.war" />
<property name="src.dir" value="src" />
<property name="client.src.dir" value="${basedir}/clientSrc" />
<property name="output.dir" value="build" />
<property name="client.dir" value="${basedir}/clientStuff" />
<property name="client.jar.name" value="Spring_CXF_MTOM_Client.jar" />
 
   <path id="jboss.classpath">
     <fileset dir="${jboss.module.dir}">
        <include name="**/*.jar"/>
     </fileset>  
   </path>

   <path id="client.classpath">
     <fileset dir="${jboss.module.dir}">
        <include name="**/*.jar"/>
     </fileset>  
     <fileset dir="${src.dir}">
        <include name="**/spring-2.5.6.jar"/>
        <!-- This Jar is needed at client side and can be downloaded from the following link -->
        <!-- http://repo1.maven.org/maven2/org/springframework/spring/2.5.6/spring-2.5.6.jar -->
     </fileset>  
     <fileset dir="${client.dir}">
        <include name="*.jar"/>
     </fileset>  
   </path>

   <taskdef name="wsprovide" classname="org.jboss.ws.tools.ant.WSProvideTask">
       <classpath refid="jboss.classpath"/>
   </taskdef>

   <taskdef name="wsconsume" classname="org.jboss.ws.tools.ant.WSConsumeTask">
       <classpath refid="jboss.classpath"/>
   </taskdef>

        <target name="init">
           <delete dir="${output.dir}" />
           <mkdir dir="${output.dir}" />
           <mkdir dir="${output.dir}/${war.tmp.name}/META-INF"/>
           <mkdir dir="${output.dir}/${war.tmp.name}/WEB-INF/classes"/>
           <delete dir="${client.dir}" />
           <mkdir dir="${client.dir}"/>

       <javac srcdir="${src.dir}" destdir="${output.dir}/${war.tmp.name}/WEB-INF/classes"  includes="*.java" excludes="Test_CXF_Client.java">
       	        <classpath>
	            <pathelement location="${output.dir}/${war.tmp.name}/WEB-INF/classes"/>
	            <path refid="jboss.classpath"/>
	        </classpath>
       </javac>
        </target>
	 
    <target name="build" depends="init">

        <copy todir="${output.dir}/${war.tmp.name}/WEB-INF">
	  <fileset dir="${basedir}/src">
	      <include name="web.xml"/>
	      <include name="cxf-servlet.xml"/>
	  </fileset>
	</copy>   
       <wsprovide
        	fork="false"
        	keep="true"
        	destdir="${output.dir}/${war.tmp.name}/WEB-INF/classes"
        	resourcedestdir="${output.dir}/${war.tmp.name}/WEB-INF/wsdl"
        	sourcedestdir="${output.dir}"
        	genwsdl="true" 
        	verbose="true"
                classpath="${output.dir}/${war.tmp.name}/WEB-INF/classes"
        	sei="ws.SpringCXFMtom">
            	<classpath>
                	  <pathelement path="${output.dir}/${war.tmp.name}/WEB-INF/classes"/>
            	</classpath>
      </wsprovide>
      <jar jarfile="${output.dir}/${war.name}" basedir="${output.dir}/${war.tmp.name}" compress="true" />  
      <delete dir="${output.dir}/${war.tmp.name}" /> 
    </target>

        <target name="deploy" depends="build">
            <echo message="*******************  Deploying   *********************" />  
            <echo message="********** ${war.name} to ${jboss.home}/standalone/deployments **********" />  
            <copy todir="${jboss.home}/standalone/deployments/">
                <fileset dir="${output.dir}/">
                  <include name="${war.name}"/> 
                </fileset>
            </copy>
            <echo message="*******************  Deployed Successfully   *********************" />  
        </target>
  
        <target name="post-deploy" depends="deploy">
            <echo message="*******************  NOTE  *********************" />
            <echo message="***** You should be able to access your WSDL using Browser now *****" />
            <echo message="                http://localhost:8080/Spring_CXF_MTOM_Service_Demo/SpringCXFMtom?wsdl          " />
        </target>  

        <target name="client">
             <delete dir="${client.dir}" />
             <wsconsume
                      fork="true"
                      keep="true"
                      destdir="${client.dir}"
                      sourcedestdir="${client.dir}"
                      package="client"
                      wsdlLocation="http://localhost:8080/Spring_CXF_MTOM_Service_Demo/SpringCXFMtom?wsdl"
                      wsdl="http://localhost:8080/Spring_CXF_MTOM_Service_Demo/SpringCXFMtom?wsdl">
            </wsconsume>
            <jar jarfile="${client.dir}/${client.jar.name}" basedir="${client.dir}" compress="true" />  
            <zip destfile="${client.dir}/${client.jar.name}" 
                 update="true"> 
                 <fileset dir="${src.dir}"> 
                       <include name="client-beans.xml" /> 
                 </fileset> 
            </zip> 
       </target>

        <target name="run" depends="client">
            <javac srcdir="${src.dir}" destdir="${client.dir}"  includes="Test_CXF_Client.java" classpathref="client.classpath"/>
            <java classname="client.Test_CXF_Client"  >
	        <classpath>
	            <pathelement location="${client.dir}"/>
	            <path refid="client.classpath"/>
	        </classpath>
                <arg line="one.jpg file:///home/jsenshar/Desktop/DELETE/one.jpg"/>
            </java>
        </target>  

</project>

NOTE: The only change in the above file you need to do is to change the “jboss.home” directory path in the second line of the above script is to point to your own JBoss AS7 directory home directory.

Step10). Now before running your ANT script to build and deploy the above webapplication you should have the ANT as well as JAVA set in the $PATH variable of the Shell / command prompt as following:

For Unix Based OS:
export PATH=/home/userone/jdk1.6.0_21/bin:/home/userone/org.apache.ant_1.6.5/bin:$PATH

For Windows Based OS:
set PATH=C:/jdk1.6.0_21/bin;C:/org.apache.ant_1.6.5/bin;%PATH%

Step11). Run the command “ant” or “ant post-deploy” which will internally build the WebService and deploy it inside the JBoss AS7 standalone profile.

[userone@localhost Spring_MTOM_Service]$ ant
Buildfile: /home/userone/Spring_MTOM_Service/build.xml
Buildfile: /home/userone/Spring_MTOM_Service/build.xml

init:
   [delete] Deleting directory /home/userone/Spring_MTOM_Service/build
    [mkdir] Created dir: /home/userone/Spring_MTOM_Service/build
    [mkdir] Created dir: /home/userone/Spring_MTOM_Service/build/Spring_CXF_MTOM_Service_Demo/META-INF
    [mkdir] Created dir: /home/userone/Spring_MTOM_Service/build/Spring_CXF_MTOM_Service_Demo/WEB-INF/classes
   [delete] Deleting directory /home/userone/Spring_MTOM_Service/clientStuff
    [mkdir] Created dir: /home/userone/Spring_MTOM_Service/clientStuff
    [javac] /home/userone/Spring_MTOM_Service/build.xml:49: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 3 source files to /home/userone/Spring_MTOM_Service/build/Spring_CXF_MTOM_Service_Demo/WEB-INF/classes

build:
     [copy] Copying 2 files to /home/userone/Spring_MTOM_Service/build/Spring_CXF_MTOM_Service_Demo/WEB-INF
[wsprovide] Generating from endpoint: ws.SpringCXFMtom
[wsprovide] log4j:WARN No appenders could be found for logger (org.apache.cxf.common.logging.LogUtils).
[wsprovide] log4j:WARN Please initialize the log4j system properly.
[wsprovide] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[wsprovide] java2ws -s /home/userone/Spring_MTOM_Service/build -classdir /home/userone/Spring_MTOM_Service/build/Spring_CXF_MTOM_Service_Demo/WEB-INF/classes -d /home/userone/Spring_MTOM_Service/build/Spring_CXF_MTOM_Service_Demo/WEB-INF/wsdl -verbose -wsdl -cp ::::::: -wrapperbean -createxsdimports ws.SpringCXFMtom
[wsprovide] java2ws - Apache CXF 2.4.4
[wsprovide] 
[wsprovide] /home/userone/Spring_MTOM_Service/build/ws/jaxws/UploadPictureAttachment.java:25: cannot find symbol
[wsprovide] symbol  : class Picture
[wsprovide] location: package ws
[wsprovide]     private ws.Picture arg1;
[wsprovide]               ^
[wsprovide] /home/userone/Spring_MTOM_Service/build/ws/jaxws/UploadPictureAttachment.java:35: cannot find symbol
[wsprovide] symbol  : class Picture
[wsprovide] location: package ws
[wsprovide]     public ws.Picture getArg1() {
[wsprovide]              ^
[wsprovide] /home/userone/Spring_MTOM_Service/build/ws/jaxws/UploadPictureAttachment.java:39: cannot find symbol
[wsprovide] symbol  : class Picture
[wsprovide] location: package ws
[wsprovide]     public void setArg1(ws.Picture newArg1)  {
[wsprovide]                           ^
[wsprovide] 3 errors
      [jar] Building jar: /home/userone/Spring_MTOM_Service/build/Spring_CXF_MTOM_Service_Demo.war

deploy:
     [echo] *******************  Deploying   *********************
     [echo] ********** Spring_CXF_MTOM_Service_Demo.war to /home/userone/boss-as-7.1.0.CR1/standalone/deployments **********
     [copy] Copying 1 file to /home/userone/boss-as-7.1.0.CR1/standalone/deployments
     [echo] *******************  Deployed Successfully   *********************

post-deploy:
     [echo] *******************  NOTE  *********************
     [echo] ***** You should be able to access your WSDL using Browser now *****
     [echo]                 http://localhost:8080/Spring_CXF_MTOM_Service_Demo/SpringCXFMtom?wsdl          

BUILD SUCCESSFUL
Total time: 4 seconds

( ( ( ( ( I S S U E – 3 ) ) ) ) ):
Even if you see that there are some exceptions while compiling the WebService using “org.jboss.ws.tools.ant.WSProvideTask” that “UploadPictureAttachment.java” is not compiling properly and seeing many compilation errors…But i ignored these errors still everything was OK. And the service deployed Successfully.

Step12). As soon as the service is deployed on JBoss AS7 you will see the following kind of output in the JBoss console :

22:19:47,218 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-7) Starting deployment of "Spring_CXF_MTOM_Service_Demo.war"
22:19:47,258 INFO  [org.jboss.wsf.stack.cxf.metadata.MetadataBuilder] (MSC service thread 1-5) Add Service
 id=ws.SpringCXFMtom
 address=http://localhost:8080/Spring_CXF_MTOM_Service_Demo/SpringCXFMtom
 implementor=ws.SpringCXFMtom
 invoker=org.jboss.wsf.stack.cxf.JBossWSInvoker
 serviceName={http://ws/}SpringCXFMtomService
 portName={http://ws/}SpringCXFMtomServicePort
 wsdlLocation=null
 mtomEnabled=false
22:19:47,259 INFO  [org.jboss.ws.common.management.DefaultEndpointRegistry] (MSC service thread 1-5) register: jboss.ws:context=Spring_CXF_MTOM_Service_Demo,endpoint=ws.SpringCXFMtom
22:19:47,266 INFO  [org.apache.cxf.service.factory.ReflectionServiceFactoryBean] (MSC service thread 1-5) Creating Service {http://ws/}SpringCXFMtomService from class ws.SpringCXFMtomIntf
22:19:47,285 INFO  [org.apache.cxf.endpoint.ServerImpl] (MSC service thread 1-5) Setting the server's publish address to be http://localhost:8080/Spring_CXF_MTOM_Service_Demo/SpringCXFMtom
22:19:47,292 INFO  [org.jboss.wsf.stack.cxf.deployment.WSDLFilePublisher] (MSC service thread 1-5) WSDL published to: file:/home/userone/boss-as-7.1.0.CR1/standalone/data/wsdl/Spring_CXF_MTOM_Service_Demo.war/SpringCXFMtomService.wsdl
22:19:47,295 INFO  [org.jboss.as.webservices] (MSC service thread 1-1) JBAS015539: Starting service jboss.ws.endpoint."Spring_CXF_MTOM_Service_Demo.war"."ws.SpringCXFMtom"
22:19:47,301 INFO  [org.jboss.web] (MSC service thread 1-3) registering web context: /Spring_CXF_MTOM_Service_Demo
22:19:47,312 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS018565: Replaced deployment "Spring_CXF_MTOM_Service_Demo.war" with deployment "Spring_CXF_MTOM_Service_Demo.war"

Step13). Now run the command “ant run” in your shell prompt to run the WebService client to access the WebService operation. “ant run” command will automatically build the client side artifacts using the “wsconsume” ant task as well and then it will run the client:

[userone@localhost CXFTimeoutClientDemo]$ ant run
Buildfile: /home/userone/Spring_MTOM_Service/build.xml

client:
   [delete] Deleting directory /home/userone/Spring_MTOM_Service/clientStuff
[wsconsume] Consuming wsdl: http://localhost:8080/Spring_CXF_MTOM_Service_Demo/SpringCXFMtom?wsdl
[wsconsume] log4j:WARN No appenders could be found for logger (org.apache.cxf.common.logging.LogUtils).
[wsconsume] log4j:WARN Please initialize the log4j system properly.
[wsconsume] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
      [jar] Building jar: /home/userone/Spring_MTOM_Service/clientStuff/Spring_CXF_MTOM_Client.jar
      [zip] Updating zip: /home/userone/Spring_MTOM_Service/clientStuff/Spring_CXF_MTOM_Client.jar

run:
    [javac] /home/userone/Spring_MTOM_Service/build.xml:121: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 1 source file to /home/userone/Spring_MTOM_Service/clientStuff
      log4j:WARN No appenders could be found for logger (org.apache.cxf.common.logging.LogUtils).
      log4j:WARN Please initialize the log4j system properly.
      log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
      
      	Got Client: org.apache.cxf.jaxws.JaxWsClientProxy@7b5c9f9d
      
      	 dataHandler.getContentType() = image/jpeg
      
      	client.uploadPictureAttachment(attachmentName,picture): File Uploaded on JBoss AS7 Server Location: /home/userone/boss-as-7.1.0.CR1/standalone/log/one.jpg

BUILD SUCCESSFUL
Total time: 9 seconds

Note: Above 3 Issues need to be fixed.

As everything is working fine and we are able to upload a file on the Server.

BUT still as mentioned in the above article that there are 3 Issues which need to be checked by JBoss Folks seems there is something is broken with the WSProvide task while compiling the “javax.xml.bind.annotation.XmlMimeType;” annotations.

.
.
Thanks :)
MiddlewareMagic Team


Copyright © 2010-2012 Middleware Magic. All rights reserved. |