You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

Web Services with CXF and Eclipse

Introduction

These directions assume that you are familiar with using Eclipse, that you know how to create a war file and that you know how to create a WSDL.

Setup

It is assumed that you have already downloaded and installed Eclipse. You will also need to download and extract the Apache CXF binary distribution and Apache Tomcat or your favorite web application server.

Updating Eclipse

You will need to install some extra plugins for the Web Services in general, and the CXF Web Services specifically. Start by downloading the CXF plugin and saving it into the eclipse plugin directory. Then, start Eclipse, and go to the updates screen (Help/Software Updates/Find and Install). Select Search for new features to install and click Next. Check all the boxes, then click Finish. Select:

  • Callisto Discovery Site
  • Data Tools Platform (DTP) Update
  • (Your version of Eclipse) Discovery Site
    • Database Development
    • Graphical Editors and Frameworks
    • Models and Model Development
      • EMF Service Data Objects (SDO)
      • EMF Service Data Objects (SDO) Extender SDK
      • XML Schema Infoset Model (XSD) Extender
    • SOA Development
    • STP SOA System Feature
    • Web and JEE Development
      • Web Standard Tools
  • Web Tools Platform (XSD) Updates
  • XML Schema Infoset Model (XSD) Updates

Be sure to include any dependencies.

Note: you may have to run this a couple of times. Some items don't show up until others have been loaded.

Finish Setting Up Eclipse

Once you have all your uploads loaded, you'll need to link CXF as your Installed runtime. Click Windows/Preferences/SOA Tools. Browse to your directory that contains Apache CXF, then click OK.

Now create a Connection Profile for your application server:

  • File/New/Other/Connection Profiles/Connection Profile
  • Select your connection profile type. If your type doesn't exist in the list, you'll need to download an Eclipse plugin for it.
  • Give it a name
  • Browse to the top-level installation directory

Creating a Project

Java First (Not Recommended)

NOTE: Keep the default directory structure. The automated system gets confused if you change it.

  • Select File/New/Other/SOA Tools/JAX-WS Java First Project
  • Say yes when asked if you want to open the JAX-WS perspective
  • Create an interface for your service:
    package com.cid.simpleservice.service
    
    public interface ScientificCalculator {
       public float squareRoot( float value,float pow);
    }
    
  • Annotate the interface:
    • Right-click class in the Outline View
    • Select JAX-WS Tools/Create Web Service
    • Right-click your method(s) name(s) in the Outline View
    • Select JAX-WS Tools/Create Web Method
      *S ave your file. As soon as you save it, you should see a new wsdl folder show up in your project directory structure. Within the folder should be a WSDL based upon your interface.

Now you'll need to make some modifications to the automatically generated comments.

  • Click on @WebService, which should be appearing above your interface name. The Annotation Properties should appear
    in the box below your editing window. If not, select Window/Show View/Other. From the pop-up menu, select SOA Tools/@ Annotation Properties.
  • In the Annotation Properties, change javax.jws.soap.SOAPBinding from false to true. This may require you to change other settings. If so, check the CXF documentation for correct values.

After your changes are made and save without any error, a WSDL should appear in the wsdl folder. If it doesn't, use java2wsdl from the CXF package. You can either run it from the command prompt, as an ant task, or from Maven. The
default output directory will be the wsdl directory.

After the WSDL is created, modify to meet your needs. For example, the port is, by default http://localhost:9090/. In addition, leaving the parameter named parameters on the input request is not acceptable to .NET code creation routines.

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="ScientificCalculatorService" targetNamespace="http://service.simpleservice.cid.com/" 
xmlns:ns1="http://service.simpleservice.cid.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  <wsdl:types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://service.simpleservice.cid.com/" 
attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://service.simpleservice.cid.com/">
<xsd:element name="squareRoot" type="squareRoot"/>
<xsd:complexType name="squareRoot">
<xsd:sequence>
<xsd:element name="arg0" type="xsd:float"/>
<xsd:element name="arg1" type="xsd:float"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="squareRootResponse" type="squareRootResponse"/>
<xsd:complexType name="squareRootResponse">
<xsd:sequence>
<xsd:element name="return" type="xsd:float"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
  </wsdl:types>
  <wsdl:message name="squareRootResponse">
    <wsdl:part name="squareRootOutput" element="ns1:squareRootResponse">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="squareRoot">
    <wsdl:part name="squareRootInput" element="ns1:squareRoot">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="ScientificCalculator">
    <wsdl:operation name="squareRoot">
      <wsdl:input name="squareRoot" message="ns1:squareRoot">
    </wsdl:input>
      <wsdl:output name="squareRootResponse" message="ns1:squareRootResponse">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="ScientificCalculatorServiceSoapBinding" type="ns1:ScientificCalculator">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="squareRoot">
      <soap:operation soapAction="" style="document"/>
      <wsdl:input name="squareRoot">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="squareRootResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="ScientificCalculatorService">
    <wsdl:port name="ScientificCalculatorPort" binding="ns1:ScientificCalculatorServiceSoapBinding">
      <soap:address location="http://localhost:8080/JavaFirstTest"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

Once your WSDL is set, use it to create your implementation class. Highlight the WSDL and right-click. Select JAX-WS Tools/Generate Code. Select Implementation and, if you're using Ant, select Generate Ant Script. If the Impl file isn't created, you can run wsdl2java using the command line, Ant task or maven.

/**
 * Please modify this class to meet your needs
 * This class is not complete
 */

package com.cid.simpleservice.service;

import java.util.logging.Logger;
import javax.jws.WebMethod;
import javax.jws.WebResult;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;

/**
 * This class was generated by the CXF 2.0.1-incubator
 * Mon Sep 17 14:10:36 EDT 2007
 * Generated source version: 2.0.1-incubator
 * 
 */

@javax.jws.WebService(name = "ScientificCalculator", serviceName = "ScientificCalculatorService",
                      portName = "ScientificCalculatorPort",
                      targetNamespace = "http://service.simpleservice.cid.com/", 
                      wsdlLocation = "file:wsdl/javaFirstTest.wsdl" ,
		      endpointInterface = "com.cid.simpleservice.service.ScientificCalculator")
                      
public class ScientificCalculatorImpl implements ScientificCalculator {

    private static final Logger LOG = Logger.getLogger(ScientificCalculatorImpl.class.getName());

    /* (non-Javadoc)
     * @see com.cid.simpleservice.service.ScientificCalculator#squareRoot(float  arg0 ,)float  arg1 )*
     */
    public float squareRoot(float arg0,float arg1) { 
        LOG.info("Executing operation squareRoot");
        System.out.println(arg0);
        System.out.println(arg1);
        try {
            float _return = 0.0f;
            
            _return = arg0 * arg0;
            return _return;
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
    }

}

Note: this last step is why it's suggested that you not use this process. Using java2wsdl, then wsdl2java is not supported at this time by CXF. And, as you've seen some of the automation doesn't work quite right.

Modify your Implementation class to reflect your actual methods.

WSDL First

Create your WSDL. The syntax is beyond the scope of this wiki. But there is a tool within Eclipse for creating one. Just select File/New/Other/Web Services/WSDL. You can validate your WSDL by using wsdl2java with the -validate flag.

Create a new project: File/New/Project/SOA Tools/JAX-WS WSDL First Project. Select your WSDL. Select to create the Implementation and, if you wish, Generate Ant Script. Leave everything checked as shown. If the code isn't automatically generated, run wsdl2java to generate your code.

Modify your implementation classes to reflect your actual methods.

Deploying Project

Select File/New/Other/SOA Tools Deployment Profile. Walk through the selections and click Finish. When the editor screen comes up, select the Configuration tab at the bottom. If you didn't add your package when you created the Deployment Profile, click the Add Package button on the right. Select your WSDL from the list, then click OK. Next, click Add Target. Choose your target server, then click OK. Click Create packages at the top of the editor window.

If the package doesn't create itself, you'll need to manually create the configuration files and war file.

Create a beans file for your CXF spring beans. This file needs to go in your WEB-INF directory of your .war file.

<?xml version="1.0" encoding="UTF-8"?>
<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-2.0.xsd
http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">


	<jaxws:endpoint id="ScientificCalculator_xml_bare"
		implementor="<b>path to your implementation directory</b>"
		wsdlLocation="WEB-INF/wsdl/JavaFirst.wsdl" address="/JavaFirst">
		<jaxws:features>
			<bean class="org.apache.cxf.feature.LoggingFeature" />
		</jaxws:features>
	</jaxws:endpoint>
	

	
</beans>

You may see errors for the endpoint tag. As long as you include the cxf libraries, you can ignore them.

You'll also need to create your web.xml file. This can just be cut and paste from this example.

<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements. See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership. The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License. You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied. See the License for the
  specific language governing permissions and limitations
  under the License.
-->

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <display-name>cxf</display-name>
    <description>cxf</description>
    <servlet>
        <servlet-name>cxf</servlet-name>
        <display-name>cxf</display-name>
        <description>Apache CXF Endpoint</description>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>cxf</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>60</session-timeout>
    </session-config>
</web-app>

Now war up your file and deploy it. Be sure that you either include all the cxf libraries in your deployment or, of there will be multiple services, copy those libraries into the appropriate lib directory of your application server. Also, be sure you include the cxf-servlet.xml and your wsdl in the appropriate locations.

Once you deploy your war file, go to: http://<your server>:<port>/<deployment name>/services. You'll see a link to your wsdl file. Click on it and your wsdl should appear.

  • No labels