JAX-WS : wsgen tool example

The wsgen tool is used to parse an existing web service implementation class and generates required files (JAX-WS portable artifacts) for web service deployment. This wsgen tool is available in $JDK/bin folder.

Use cases

2 common use cases for wsgen tool :

  1. Generates JAX-WS portable artifacts (Java files) for web service deployment.
  2. Generates WSDL and xsd files, for testing or web service client development.

Let’s see a web service implementation class, quite simple, just a method to return a string.

File : ServerInfo.java


package com.mkyong.ws;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService
public class ServerInfo{

	@WebMethod
	public String getIpAddress() {
		
		return "10.10.10.10";
		
	}

}

1. Generates JAX-WS portable artifacts (Java files)

To generate all the JAX-WS portable artifacts for above web service implementation class (ServerInfo.java), use following command :

Command : wsgen usage


D:\>wsgen -verbose -keep -cp . com.mkyong.ws.ServerInfo

Note:   ap round: 1
[ProcessedMethods Class: com.mkyong.ws.ServerInfo]
[should process method: getIpAddress hasWebMethods: true ]
[endpointReferencesInterface: false]
[declaring class has WebSevice: true]
[returning: true]
[WrapperGen - method: getIpAddress()]
[method.getDeclaringType(): com.mkyong.ws.ServerInfo]
[requestWrapper: com.mkyong.ws.jaxws.GetIpAddress]
[ProcessedMethods Class: java.lang.Object]
com\mkyong\ws\jaxws\GetIpAddress.java
com\mkyong\ws\jaxws\GetIpAddressResponse.java
Note:   ap round: 2

In this case, it generated four files :

  1. com\mkyong\ws\jaxws\GetIpAddress.java
  2. com\mkyong\ws\jaxws\GetIpAddress.class
  3. com\mkyong\ws\jaxws\GetIpAddressResponse.java
  4. com\mkyong\ws\jaxws\GetIpAddressResponse.class

File : GetIpAddress.java


package com.mkyong.ws.jaxws;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "getIpAddress", namespace = "http://ws.mkyong.com/")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "getIpAddress", namespace = "http://ws.mkyong.com/")
public class GetIpAddress {

}

File : GetIpAddressResponse.java



package com.mkyong.ws.jaxws;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "getIpAddressResponse", namespace = "http://ws.mkyong.com/")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "getIpAddressResponse", namespace = "http://ws.mkyong.com/")
public class GetIpAddressResponse {

    @XmlElement(name = "return", namespace = "")
    private String _return;

    /**
     * 
     * @return
     *     returns String
     */
    public String getReturn() {
        return this._return;
    }

    /**
     * 
     * @param _return
     *     the value for the _return property
     */
    public void setReturn(String _return) {
        this._return = _return;
    }

}

2. Genarates WSDL and xsd

To generate WSDL and xsd files for above web service implementation class (ServerInfo.java), add an extra -wsdl in the wsgen command :

Command : wsgen usage


D:\>wsgen -verbose -keep -cp . com.mkyong.ws.ServerInfo -wsdl

Note:   ap round: 1
[ProcessedMethods Class: com.mkyong.ws.ServerInfo]
[should process method: getIpAddress hasWebMethods: true ]
[endpointReferencesInterface: false]
[declaring class has WebSevice: true]
[returning: true]
[WrapperGen - method: getIpAddress()]
[method.getDeclaringType(): com.mkyong.ws.ServerInfo]
[requestWrapper: com.mkyong.ws.jaxws.GetIpAddress]
[ProcessedMethods Class: java.lang.Object]
com\mkyong\ws\jaxws\GetIpAddress.java
com\mkyong\ws\jaxws\GetIpAddressResponse.java
Note:   ap round: 2

In this case, it generated six files :

  1. com\mkyong\ws\jaxws\GetIpAddress.java
  2. com\mkyong\ws\jaxws\GetIpAddress.class
  3. com\mkyong\ws\jaxws\GetIpAddressResponse.java
  4. com\mkyong\ws\jaxws\GetIpAddressResponse.class
  5. ServerInfoService_schema1.xsd
  6. ServerInfoService.wsdl

File : ServerInfoService_schema1.xsd


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" 
targetNamespace="http://ws.mkyong.com/" 
xmlns:tns="http://ws.mkyong.com/" 
xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="getIpAddress" type="tns:getIpAddress"/>

  <xs:element name="getIpAddressResponse" type="tns:getIpAddressResponse"/>

  <xs:complexType name="getIpAddress">
    <xs:sequence/>
  </xs:complexType>

  <xs:complexType name="getIpAddressResponse">
    <xs:sequence>
      <xs:element name="return" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

File : ServerInfoService.wsdl


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions targetNamespace="http://ws.mkyong.com/" 
name="ServerInfoService" xmlns="http://schemas.xmlsoap.org/wsdl/" 
xmlns:tns="http://ws.mkyong.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  <types>
    <xsd:schema>
      <xsd:import namespace="http://ws.mkyong.com/" 
	         schemaLocation="ServerInfoService_schema1.xsd"/>
    </xsd:schema>
  </types>
  <message name="getIpAddress">
    <part name="parameters" element="tns:getIpAddress"/>
  </message>
  <message name="getIpAddressResponse">
    <part name="parameters" element="tns:getIpAddressResponse"/>
  </message>
  <portType name="ServerInfo">
    <operation name="getIpAddress">
      <input message="tns:getIpAddress"/>
      <output message="tns:getIpAddressResponse"/>
    </operation>
  </portType>
  <binding name="ServerInfoPortBinding" type="tns:ServerInfo">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <operation name="getIpAddress">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
  </binding>
  <service name="ServerInfoService">
    <port name="ServerInfoPort" binding="tns:ServerInfoPortBinding">
      <soap:address location="REPLACE_WITH_ACTUAL_URL"/>
    </port>
  </service>
</definitions>

Published It!

All files are ready, publish it via endpoint publisher.


package com.mkyong.endpoint;
 
import javax.xml.ws.Endpoint;
import com.mkyong.ws.ServerInfo;

//Endpoint publisher
public class WsPublisher{
 
	public static void main(String[] args) {
	   Endpoint.publish("http://localhost:8888/ws/server", new ServerInfo());
	   
	   System.out.println("Service is published!");
    }
 
}

Download Source Code

Download It – JAX-WS-wsgen-command-example.zip (5KB)

Reference

  1. Official site : wsgen JavaDoc

About the Author

author image
mkyong
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter. If you like my tutorials, consider make a donation to these charities.

Comments

avatar
17 Comment threads
5 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
18 Comment authors
Mike LamaFazilExcelantojkarjun cr Recent comment authors
newest oldest most voted
david
Guest
david

I had modify the generated xsd file said minOccurs change to 1. But how can I publish it on
http://127.0.0.1:9999/ws/hello?wsdl

It always publish the default wsdl and xsd back to me. the one I change never display. Where should I put the wsdl and xsd files under by file system?

Mike Lama
Guest
Mike Lama

Thank you.

Excelanto
Guest
Excelanto

Thanks for your valuable posting.I have collect more than information from your website. It is really wonderful blog. please added more than tips. i’m working in Erp in india.Here providing very low price and Quality ERP,Cloud ERP, CMS , responsive webdesign and ERP. you have any more than information kindly make me call this number 044-42127512 or send your mail info@excelanto.com.

jk
Guest
jk

How can we have the schema included within the WSDL. I dnt wish to have a seperate schema file.Is there a way to specify that.

Fazil
Guest
Fazil

change the SoapBinding style to RPC then all the types will be included in WSDL itself.

arjun cr
Guest
arjun cr

What If I have My Own JaxB Classes,How to create the XSD from those JAXB Classes,using WSGEN,
I know there are couple of tools to generate XSD file from JAXB classes,But I want to create those XSD file from my own already created JaxB classes,during the generation of WSDL using wsgen.
Thanks in Advance

Lily
Guest
Lily

hi, I have a problem when i execute the command wsgen
The path of my java project is “E:\java\Server\src\com\mkyong\ws\ServerInfo.java”
I use the wsgen commands as:
E:\>wsgen -verbose -keep -cp E:\java\Server\src\com.mkyong.ws.ServerInfo
error:
Missing SEI

Could you help me resolve?Thanks

Salwa
Guest
Salwa

Follow the tutorial here: http://www.youtube.com/watch?v=od6fNiegu-Q
it will guide you through the eclipse in how to use the wsgen comment to generate the WSDL…

Dilip
Guest
Dilip

A very good example. I succeded to create and run my first webservice after following this simple and straight forward example(I was struggling to create my helloworld type simple webservice). Thanks mr. MKYong.

Amit Singh Hora
Guest
Amit Singh Hora

Hi,

i am using the wsgen command and i am getting the following output on command promp but no source files or classes are getting generated and pointers on this…
C:\Program Files\Java\jdk1.6.0_31\bin>wsgen -verbose -keep -cp . Service.AddSer
viceImpl -d src
Note: ap round: 1
[ProcessedMethods Interface: Service.AddService]
[should process method: addNumber hasWebMethods: false ]
[endpointReferencesInterface: true]
[declaring class has WebSevice: true]
[returning: true]
[WrapperGen – method: addNumber(int,int)]
[method.getDeclaringType(): Service.AddService]

baoyu
Guest
baoyu

remove the “parameterStyle = ParameterStyle.BARE”

trackback
Delicious Bookmarks for March 15th from 17:13 to 21:51 « Lâmôlabs

[…] JAX-WS : wsgen tool example – March 15th ( tags: jax-ws java wsgen wsdl example guide tutorial programming webservices ) […]

Praveen Das
Guest
Praveen Das

Hi MKYong, I’m encountering a wsgen compilation failure for Hibernate Annotations. Scenario – Create JAX-WS webservice for validation of a user. Issue Faced – wsgen command fails with below error error: Could not create declaration for annotation type com. error: Could not create declaration for annotation type com. 2 errors error: compilation failed, errors should have been reported Command- wsgen -s src/main/java -d target/Struts2Example/WEB-INF/classes -cp target/Struts2Example/WEB-INF/classes com.hcl.customer.dao.impl.WSCustomerDAOImpl Code – @WebService(endpointInterface=”com.hcl.customer.dao.WSCustomerDAO”) public class WSCustomerDAOImpl implements WSCustomerDAO{ Logger logger = Logger.getLogger(WSCustomerDAOImpl.class); @SessionTarget Session session; @TransactionTarget Transaction transaction; // return customer model if the username & password exists public Customer validateUser(String username, String… Read more »

Abilash
Guest
Abilash

I am getting the below exception while running your file. may I know where is the issue?



0

java.lang.ArrayIndexOutOfBoundsException: 0 at org.apache.axis2.description.AxisService.getWSDL(AxisService.java:1643) at org.apache.axis2.description.AxisService.printWSDL(AxisService.java:1413) at org.apache.axis2.transport.http.HTTPWorker.service(HTTPWorker.java:154) at org.apache.axis2.transport.http.server.AxisHttpService.doService(AxisHttpService.java:281) at org.apache.axis2.transport.http.server.AxisHttpService.handleRequest(AxisHttpService.java:187) at org.apache.axis2.transport.http.server.HttpServiceProcessor.run(HttpServiceProcessor.java:82) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

Abilash
Guest
Abilash

Its in the browser, after publishing the WS.

sebastian
Guest
sebastian

hi, i am having a problem when i execute the command wsgen

C:\Users\ominatti\Documents\JAVA\JWS\EXAMPLE WSGEN\WebServices>wsgen -verbose -k
eep -cp . com.mkyong.ws.ServerInfo

error
Class not found: “com.mkyong.ws.ServerInfo”

Could you help me please ¿?

Thanks

Mao
Guest
Mao

You must have com.mkyong.ws.ServerInfo class file after compilation(javac)

gyan
Guest
gyan

Please Anyone Advice me ..

How to annotate this claas to create web service.

As I found null value in list type field from web service.

@WebMethod(operationName = “getTickets”)

public List getTickets(long ticketId) throws TicketingException {
try {
return new TicketBO().getTickets(ticketId);
} catch (TicketingException e) {
logger.error(e);
throw e;
}
}

public class Ticket{

private Long ticketId;
private String callerNumber;
private List dynaFieldValues;

}

public class DynaFieldValue implements Serializable,Comparable {

private DynaFieldValueId id;
private String value;

}

trackback
JAX-WS Hello World Example – Document Style

[…] tool is available in the “JDK_Pathbin” folder. For detail, please read this JAX-WS : wsgen tool example […]

Jitendra
Guest
Jitendra

Hi
Thanks for nice tutorial, Is it possible to generate wsdl with inline schema,
is there way we can automate generation of wsdl with inline (instead of having separate schema file)
Many Thanks in advance :)

Levan
Guest
Levan

Just a little side-note: before using wsgen tool, web service implementation class must be compiled (using javac).

:-)

trackback
JAX-WS Tutorial

[…] files (JAX-WS portable artifacts) for web service client to access the published web services.JAX-WS : wsgen tool example The wsgen tool is used to parse an existing web service implementation class and generates required […]