Spring 3 MVC and XML example

In Spring 3, one of the feature of “mvc:annotation-driven“, is support for convert object to/from XML file, if JAXB is in project classpath.

In this tutorial, we show you how to convert a return object into XML format and return it back to user via Spring @MVC framework.

Technologies used :

  1. Spring 3.0.5.RELEASE
  2. JDK 1.6
  3. Eclipse 3.6
  4. Maven 3
JAXB in JDK6
JAXB is included in JDK6, so, you do not need to include JAXB library manually, as long as object is annotated with JAXB annotation, Spring will convert it into XML format automatically.

1. Project Dependencies

No extra dependencies, you need to include Spring MVC in your Maven pom.xml only.


	<properties>
		<spring.version>3.0.5.RELEASE</spring.version>
	</properties>

	<dependencies>

		<!-- Spring 3 dependencies -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>

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

	</dependencies>

2. Model + JAXB

A simple POJO model and annotated with JAXB annotation, later convert this object into XML output.


package com.mkyong.common.model;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "coffee")
public class Coffee {

	String name;
	int quanlity;

	public String getName() {
		return name;
	}

	@XmlElement
	public void setName(String name) {
		this.name = name;
	}

	public int getQuanlity() {
		return quanlity;
	}

	@XmlElement
	public void setQuanlity(int quanlity) {
		this.quanlity = quanlity;
	}

	public Coffee(String name, int quanlity) {
		this.name = name;
		this.quanlity = quanlity;
	}

	public Coffee() {
	}
	
}

3. Controller

Add “@ResponseBody” in the method return value, no much detail in the Spring documentation.

As i know, when Spring see

  1. Object annotated with JAXB
  2. JAXB library existed in classpath
  3. “mvc:annotation-driven” is enabled
  4. Return method annotated with @ResponseBody

It will handle the conversion automatically.


package com.mkyong.common.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.mkyong.common.model.Coffee;

@Controller
@RequestMapping("/coffee")
public class XMLController {

	@RequestMapping(value="{name}", method = RequestMethod.GET)
	public @ResponseBody Coffee getCoffeeInXML(@PathVariable String name) {

		Coffee coffee = new Coffee(name, 100);
		
		return coffee;

	}
	
}

4. mvc:annotation-driven

In one of your Spring configuration XML file, enable “mvc:annotation-driven“.


<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc" 
	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-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

	<context:component-scan base-package="com.mkyong.common.controller" />

	<mvc:annotation-driven />

</beans>
Note
Alternatively, you can declares “spring-oxm.jar” dependency and include following MarshallingView, to handle the conversion. With this method, you don’t need annotate @ResponseBody in your method.


<beans ...>
	<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
	
	<bean id="xmlViewer" 
		class="org.springframework.web.servlet.view.xml.MarshallingView">
		<constructor-arg>
		  <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
			<property name="classesToBeBound">
				<list>
					<value>com.mkyong.common.model.Coffee</value>
				</list>
			</property>
		  </bean>
		</constructor-arg>
	</bean>
</beans>

5. Demo

URL : http://localhost:8080/SpringMVC/rest/coffee/arabica

spring mvc and xml example demo

Download Source Code

Download it – SpringMVC-XML-Example.zip (7 KB)

References

  1. Spring MVC and Rss example
  2. mvc-annotation-driven JavaDoc
  3. Jaxb2Marshaller JavaDoc
  4. ResponseBody.html JavaDoc

29 comments on “Spring 3 MVC and XML example

  1. Hi All, I follow the same code and project executed successfully, but I’m unable to get XML format output, its output on browser is “arabika 100”

    Reply
  2. In the other browsers example works perfect in any case: with “.xml” and without “.xml”

    Reply
  3. Thank you so much! You example help me a lot!!
    Could i make a little notice : if you want the example works in IE browser – use in the end “.xml”. I mean value of RequestMapping

    Reply
  4. I want to add one information to the xml header. I used

    It did not help

    Reply
      1. My text is not appearing.
        I basically want to add a Doctype with a reference to a dtd file in the Doctype element

        Reply
  5. I am using servlet with Spring as given below. This class has a field which has been AutoWired. I want to use xml configuration for this class and remove off annotation completely . Please let me know how to do this

    @Controller(“oauth2Servlet”)
    final public class Oauth2Servlet extends HttpServlet implements HttpRequestHandler

    …… Web.xml configuration

    Oauth2Servlet
    oauth2Servlet
    org.springframework.web.context.support.HttpRequestHandlerServlet
    1

    oauth2Servlet
    /oauth2

    Reply
  6. public @ResponseBody Coffee getCoffeeInXML(@RequestBody Coffee coffee){

    String name = coffee.getname;
    int name = coffee.getQuantity;
    }
    Is this correct way to use @RequestBody xml to pojo mapping

    Reply
  7. In Spring MVC
    i use AJAX
    want @controller return “Object also convert XML-String”
    (response header text/plain not application/xml)
    how to set spriong config

    Reply
  8. Hi it is working fine for list also,

    Write a wrapper class for coffee its working , great tutorial , thanks for help

    Reply
  9. in this case.
    How to change “coffee Object” the other xml declaration

    Reply
  10. when i run the application . it breaks on hitting the specified url. Pls help.

    Reply
  11. Hi Mark change config to follow .will not working why?

    com.mkyong.common.model

    Reply
    1. Hi Mark change config to follow .will not working why?

      com.mkyong.common.model

      Reply
    2. Hi Mark change config to packagesToScan it’s not working anything need pay attention to?

      Reply
  12. <pre lang="language" I am getting below error , while using above example in my system, I have jdk1.6 that is why i did not include any jaxb in my classpath.

    System.Windows.Markup.XamlParseException: 'Cannot create unknown type 'scenario'.' Line number '1' and line position '57'.
    ---> System.Xaml.XamlObjectWriterException: 'Cannot create unknown type 'scenario'.' Line number '1' and line position '57'.
       at System.Xaml.XamlObjectWriter.WriteStartObject(XamlType xamlType)
       at System.Xaml.XamlWriter.WriteNode(XamlReader reader)
       at System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack`1 stack, IStyleConnector styleConnector)
       at System.Windows.Markup.XamlReader.LoadAsync(XmlReader reader, ParserContext parserContext)
       --- End of inner exception stack trace ---
    
    Reply
  13. Ah, seem like fine following the case which return is collection:

    @ResponseBody
    @RequestMapping(value="/name/{name}", produces = "application/xml", method= RequestMethod.GET)
    public EmployeeList getEmployeeByName(Model model, @PathVariable String name){
    	List<Employee> e = empService.selectEmployeeByName(name);
    	EmployeeList abc= new EmployeeList(e); // EmployeeList just is List
    	return abc;
    }
    
    Reply
    1. Additionally, in dispatcher file:

       
      <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
          <property name="classesToBeBound">
      	<list>
      		<value>com.abc.Employee</value>
                      <value>com.abc.EmployeeList</value>
      	</list>
          </property>
      </bean>
      
      Reply
    2. I solved the problem, thank you very much for your answer, thank the authors often articles

      Reply
    3. I tried for a List and could not make it to work.
      Please help with a working code.
      You mentioned EmployeeList is just a list…. could you please post that code ?

      Many thanks

      Reply
  14. Thanks for this tutorial..
    It really helped me a lot in setting up Spring restful services..

    Reply
  15. Great tutorial… i got problems when i do for a List. i’d made a Coffees wrapper class for the list but i got repeated elements 🙁

    Reply
  16. Simple and Effective tutorial!.. Keep up the good work Mr.young

    Reply
  17. What if i want to return collection of coffee ?

    Reply

Leave a Comment

Your email address will not be published. Required fields are marked *