Skip to main content

Deployment Descriptor-free Web services in GlassFish

Posted by arungupta on February 2, 2007 at 10:12 AM PST

One of the big benefits of JAX-WS 2.0 is that deployment descriptors are
optional. By optional, it means no deployment descriptors are required if you
can live with the reasonable defaults defined by the JAX-WS specification. So if
you develop a trivial Web service, starting from POJO (Plain Old Java Object),
as:

@javax.jws.WebService(targetNamespace="http://example.org")

public class Hello {

  public String sayHello(String name) {

    return "Hello " + name;

  }

}

compile it and drop the class in $AS_HOME/domains/domain/autodeploy
directory, where AS_HOME is the directory location for GlassFish,
then you have deployed a Web service at http://localhost:8080/Hello/HelloService?wsdl.
With GlassFish v2
M4
, the WSDL looks like (default values are highlighted in bold):

<?xml version="1.0" ?>

<definitions 

  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"

  xmlns:tns="http://example.org"

  xmlns:xsd="http://www.w3.org/2001/XMLSchema"

  xmlns="http://schemas.xmlsoap.org/wsdl/"

  targetNamespace="http://example.org"

  name="HelloService">

  <types>

    <xsd:schema>

      <xsd:import namespace="foobar"
schemaLocation="http://localhost:8080/Hello/HelloService?xsd=1">

      </xsd:import>

    </xsd:schema>

  </types>

  <message name="sayHello">

    <part name="parameters" element="tns:sayHello">

    </part>

  </message>

  <message name="sayHelloResponse">

    <part name="parameters" element="tns:sayHelloResponse">

    </part>

  </message>

  <portType name="Hello">

    <operation name="sayHello">

      <input message="tns:sayHello">

      </input>

      <output message="tns:sayHelloResponse">

      </output>

    </operation>

  </portType>

  <binding name="HelloPortBinding" type="tns:Hello">

    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document">

    </soap:binding>

    <operation name="sayHello">

      <soap:operation soapAction="">

      </soap:operation>

      <input>

        <soap:body use="literal">

        </soap:body>

      </input>

      <output>

        <soap:body use="literal">

        </soap:body>

      </output>

    </operation>

  </binding>

  <service name="HelloService">

    <port name="HelloPort" binding="tns:HelloPortBinding">

      <soap:address location="http://localhost:8080/Hello/HelloService">

      </soap:address>

    </port>

  </service>

</definitions>

The wsdl:service/@name, wsdl:port/@name, wsdl:portType/@name
and other similar elements use a default value, defined by the JAX-WS
specification, derived from the class name and method name. All these values can
be easily configured using @WebService
and @WebMethod.

This class is in default package and that's why @WebService/targetNamespace
attribute is required. Otherwise targetNamespace is derived from
the package name and in which case the Web service implementation looks like:

package hello;
public class Hello 

  public String sayHello(String name) {

                   return "Hello " + name;

         }

}

There is a similar sample in GlassFish
samples
as well. A much broader collection of JAX-WS samples is available here.

This Deployment Descriptor-free concept also work if you really like to
bundle up your classes together in a WAR. Basically just package your classes in
WEB-INF/classes directory and that's it. No web.xml, sun-web.xml
or any proprietary descriptors are required.

As shown above, converting your POJO to a Web service is really simple, does
not require any deployment descriptors, improves readability of code and is
backed by the production-quality JAX-WS runtime in GlassFish.

And if you are using NetBeans,
then you don't need to worry about any of these details.

Technorati: Web
service
GlassFish JAX-WS
JAXWS Samples
Ease of Use

Related Topics >>