Java and J2EE Tutorials, Jsp and Servlet Tutorials, Spring MVC, Solr, XML, JSON Examples, Hibernate & Struts 2 Hello World projects



Thursday, 25 April 2013

Spring Web Services - Part 1 (Create JAXB classes automatically using Maven)

Today we are starting a series of Java Web Services using Spring tutorial series, this spring web services tutorial series with ends with three parts. In todays discussion we will cover xsd to java classes using maven. In our previous discussion we came across, What are Web Services ?, What is XSD ?, What is WSDL ? and a basic introduction to Spring Web Services. In this particular blog we will create java classes from an xsd automatically using Maven in Eclipse. We will start from a simple Maven project having required XSD’s, than we will create JAXB files automatically using Maven.

Our objective for today’s discussion is to create an Maven web application in Eclipse with required pom.xml entries and setup so that our objective xsd to java classes can be obtained. It will contain two Web Services one to except user’s details and save them in My Sql database. In second service we will retrieve those user’s details on the basis of their id’s.


Database Setup

Before we start writing code for the application let’s first create a database that will be used by our application to save and retrieve User’s data. Here is sql script :
-- Dumping database structure for userdb
CREATE DATABASE IF NOT EXISTS `userdb` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `userdb`;

-- Dumping structure for table userdb.user
CREATE TABLE IF NOT EXISTS `user` (
  `id` varchar(10) DEFAULT NULL,
  `name` varchar(10) DEFAULT NULL,
  `gender` varchar(10) DEFAULT NULL,
  `status` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


Create Simple Spring Web Service in Eclipse using Maven

Creating Spring Web Services in Eclipse using Maven is a four step process, and everything will be done.

Step 1 : Create a simple Maven Project in Eclipse and add required goal entries and dependencies details to pom.xml.
Step 2 : Create xsd files as per the functioning, the Web Service is going to implement. Add them to project (ex. /WEB-INF/schemas/..) , and generate classes using Maven.
Step 3 : Create an Endpoint, Service and Dao layer classes for the application.
Step 4 : Create spring-configurations and test the Web Services.

Now let’s discuss all these steps in details and create a simple Web Service application step by step.

Step 1 : Create a simple Maven Project in Eclipse and add required goal entries and dependencies details to pom.xml.

Create a Maven Project from eclipse (File > New > Project > Maven Project) and provide Group Id and Artifact Id as “spring-server-final” or something you desire and replace your pom.xml contents with this file mentioned below :
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
        http://maven.apache.org/maven-v4_0_0.xsd">
 <artifactId>spring-server-final</artifactId>
 <modelVersion>4.0.0</modelVersion>
 <packaging>war</packaging>
 <groupId>spring-server-final</groupId>
 <version>1.0-SNAPSHOT</version>
 <name>spring-server-final</name>
 <url>http://maven.apache.org</url>
 <repositories>
  <repository>
   <id>spring-maven-milestone</id>
   <name>Springframework Maven Repository</name>
   <url>http://maven.springframework.org/milestone</url>
  </repository>
 </repositories>
 <properties>
  <spring.version>3.2.2.RELEASE</spring.version>
  <spring.ws.version>2.0.0.RELEASE</spring.ws.version>
  <context.path>spring-webservice-api</context.path>
 </properties>
 <dependencies>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-core</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-web</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.6</version>
  </dependency>

  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-beans</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-aop</artifactId>
   <version>${spring.version}</version>
  </dependency>

  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-aspects</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>commons-collections</groupId>
   <artifactId>commons-collections</artifactId>
   <version>3.2</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-oxm</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework.ws</groupId>
   <artifactId>spring-ws-core</artifactId>
   <version>${spring.ws.version}</version>
  </dependency>
  <dependency>
   <groupId>org.apache.ws.commons.schema</groupId>
   <artifactId>XmlSchema</artifactId>
   <version>1.4.3</version>
  </dependency>
  <dependency>
   <groupId>javax.xml.bind</groupId>
   <artifactId>jaxb-api</artifactId>
   <version>2.0</version>
  </dependency>
  <dependency>
   <groupId>com.sun.xml.bind</groupId>
   <artifactId>jaxb-impl</artifactId>
   <version>2.0.3</version>
  </dependency>
  <dependency>
   <groupId>org.apache.xmlbeans</groupId>
   <artifactId>xmlbeans</artifactId>
   <version>2.4.0</version>
  </dependency>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.8.1</version>
   <scope>test</scope>
  </dependency>
  <dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <scope>compile</scope>
   <version>1.2.16</version>
  </dependency>
 </dependencies>

 <build>
  <finalName>spring-server-final</finalName>
  <pluginManagement>
   <plugins>
   
    <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-compiler-plugin</artifactId>
     <version>2.3.1</version>
     <configuration>
      <source>1.6</source>
      <target>1.6</target>
     </configuration>
    </plugin>

    <plugin>
     <groupId>org.codehaus.mojo</groupId>
     <artifactId>jaxb2-maven-plugin</artifactId>
   
     <executions>
      <execution>
       <goals>
        <goal>xjc</goal>
       </goals>
      </execution>
     </executions>
     <configuration>
      <schemaDirectory>src/main/webapp/schemas/</schemaDirectory>
     </configuration>
    </plugin>
    
   </plugins>
  </pluginManagement>
 </build>
</project>


Step 2 :  Create xsd files as per the functioning, the Web Service is going to implement. Add them to project (ex. /WEB-INF/schemas/..)

Create a new folder /webapp/schemas/  under /src/main/ and copy xsd files listed below there.

\src\main\webapp\schemas\UserDetails.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://user.javaguys.blog.com"
 targetNamespace="http://user.javaguys.blog.com" elementFormDefault="qualified"
 attributeFormDefault="unqualified">
 <xs:element name="User" type="User" />
 <xs:complexType name="User">
  <xs:sequence>
   <xs:element name="UserId" type="xs:string" />
   <xs:element name="UserName" type="xs:string" />
   <xs:element name="UserGender" type="xs:string" />
   <xs:element name="UserStatus" type="xs:string" />
  </xs:sequence>
 </xs:complexType>
</xs:schema>  


\src\main\webapp\schemas\GetUserServiceOperations.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns="http://com/javaguys/webservices/getUserServices" xmlns:user="http://user.javaguys.blog.com"
 targetNamespace="http://com/javaguys/webservices/getUserServices"
 elementFormDefault="qualified">
 <xsd:import namespace="http://user.javaguys.blog.com"
  schemaLocation="UserDetails.xsd" />
 <xsd:element name="GetUserRequest">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element name="userId" type="xsd:string" />
   </xsd:sequence>
  </xsd:complexType>
 </xsd:element>
 <xsd:element name="GetUserResponse">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element name="userDetails" type="user:User" />
   </xsd:sequence>
  </xsd:complexType>
 </xsd:element>
</xsd:schema>  



\src\main\webapp\schemas\SaveUserServiceOperations.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns="http://com/javaguys/webservices/saveUserServices" xmlns:user="http://user.javaguys.blog.com"
 targetNamespace="http://com/javaguys/webservices/saveUserServices"
 elementFormDefault="qualified">
 <xsd:import namespace="http://user.javaguys.blog.com"
  schemaLocation="UserDetails.xsd" />
 <xsd:element name="SaveUserRequest">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element name="userDetails" type="user:User" />
   </xsd:sequence>
  </xsd:complexType>
 </xsd:element>
 <xsd:element name="SaveUserResponse">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element name="userId" type="xsd:string" />
   </xsd:sequence>
  </xsd:complexType>
 </xsd:element>
</xsd:schema>  

Now do a maven-install mvn install -Dmaven.test.skip=true, and you will get all required classes automatically created in target folder. See the picture below :

Just copy these files to your src folder and you are done with almost half of your work. Please note that while copying copy from ‘com’ folder and exclude jaxb and generated-sources folders. After copying these classes to your src folder your project will look something like this picture:



In this tutorial we saw how to generate Java classes from .xsd files using Maven, the task is almost done we only need to add some database related files and simple java code. Step 3 and Step 4 are covered in the next part of this tutorial. Click Here to go next part of the tutorial.








Thanks for reading !
Being Java Guys Team

Download "Spring Web Service Example project" from "SkyDrive"






10 comments:

  1. I followed step by step ... but didn't succeeded in generating class file from the jaxb compiler.

    Tx,
    Amit

    ReplyDelete
  2. Hi,

    Did you check your target folder, class files are generated there.
    A better option is to run the example project and find out the mistake.

    Hope it helps !

    ReplyDelete
  3. Hi,
    thank you for this tutorial!
    You wrote to do a maven-clean for generate the classes, maybe you would mean a maven-build with goals jaxb2:xjc?
    It works for me!

    Davide

    ReplyDelete
    Replies
    1. it Works for me too Thank you

      Delete
  4. I am all set for the last error,.

    Then I did :

    mvn clean package

    what was generated was only two empty directories :

    target
    -- generated-sources
    ---- annotations
    ---- test-annotations

    your help is appreciated.

    ReplyDelete
  5. Too bad the author doesn't correct this otherwise good tutorial after so many complaints.

    To make the class generation work you should :
    1. Remove the pluginManagement element (and of course don't forget the closing tag). This element is for defining plugins in the parent pom, which is not the case here.

    2. You should of course execute 'mvn clean compile' (or 'mvn compile') in order to generate the classes, a 'mvn clean' will only delete the target folder.

    ReplyDelete
  6. Has anyone tried intput operation with name GetUser instead of GetUserRequest
    And then call the webservice from SOAP UI. I have generated Webservices with operations have suffix as Request and Response but when I remove Request word SOAPUI simply doesn't bring the request operation for me to post the request.
    Let me know what could be wrong if you have any idea Appreciate your time.

    ReplyDelete
  7. these is good tutorial for beginner like me..thanks for these awesome tutorial..

    ReplyDelete
  8. Thanks Dirk Estievenart26 , your are right, removing pluginManagement wotks for me

    ReplyDelete
  9. i cant able to generate class files from schema, please anyone help me

    ReplyDelete

Like Us on Facebook


Like Us On Google+



Contact

Email: neel4soft@gmail.com
Skype: neel4soft