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
Tags :

About the Author

mkyong
Founder of Mkyong.com and HostingCompass.com, love Java and open source stuff. Follow him on Twitter, or befriend him on Facebook or Google Plus. If you like my tutorials, consider make a donation to these charities.

Comments

  • Pingback: water ionizer()

  • Pingback: car parking()

  • Pingback: YouTube views kopen()

  • Pingback: water ionizer machines()

  • Pingback: laan penge nu og her 18 aar()

  • Pingback: 3gp mobile porn()

  • Pingback: stop parking()

  • Pingback: lan penge her og nu()

  • Pingback: watch movies online free()

  • Pingback: watch movies online()

  • Pingback: Blue Coaster33()

  • lee

    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

  • sandeep

    Hi it is working fine for list also,

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

  • lee

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

  • lee

    how to set xml data use another encoding

  • vikesh

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

  • Fei

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

    com.mkyong.common.model

    • Fei

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

      com.mkyong.common.model

    • Fei

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

  • Satya Prakash

    <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'.
    ---&gt; 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 ---
  • http://mkyong.com Praveen.S.Kalawad

    Thanks alot Mr.MKYong

  • http://thanhtung90.info Tung

    Ah, seem like fine following the case which return is collection:

    @ResponseBody
    @RequestMapping(value=&quot;/name/{name}&quot;, produces = &quot;application/xml&quot;, method= RequestMethod.GET)
    public EmployeeList getEmployeeByName(Model model, @PathVariable String name){
    	List&lt;Employee&gt; e = empService.selectEmployeeByName(name);
    	EmployeeList abc= new EmployeeList(e); // EmployeeList just is List
    	return abc;
    }
    • http://thanhtung90.info Tung

      Additionally, in dispatcher file:

      &lt;bean class=&quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&quot;&gt;
          &lt;property name=&quot;classesToBeBound&quot;&gt;
      	&lt;list&gt;
      		&lt;value&gt;com.abc.Employee&lt;/value&gt;
                      &lt;value&gt;com.abc.EmployeeList&lt;/value&gt;
      	&lt;/list&gt;
          &lt;/property&gt;
      &lt;/bean&gt;
    • ant

      I solved the problem, thank you very much for your answer, thank the authors often articles

    • Jay

      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

  • pavan

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

  • Mauro

    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 :(

  • Sudhakar

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

  • guiltry

    What if i want to return collection of coffee ?

    • http://thanhtung90.info Tung

      I have same question, too.

  • Pingback: Blue Ray Plus - Latest Technology News()

  • Pingback: Spring 3 MVC ContentNegotiatingViewResolver example()

  • Pingback: Spring 3 MVC and JSON example()