See my following 4 simple examples, 2 works for xml, the other 2 does not.
//works for html, json, xml
@RequestMapping(value = "/test", method = RequestMethod.GET)
public ModelAndView testContentNegiotation(HttpServletRequest request, HttpServletResponse response) {
ModelAndView mav = new ModelAndView();
TestTO test = new TestTO("some msg", -888);
mav.addObject("test", test);
mav.setViewName("test"); //test is a jsp page
return mav;
}
//does not work for xml
@RequestMapping(value = "/test", method = RequestMethod.GET)
public ModelAndView testContentNegiotation(HttpServletRequest request, HttpServletResponse response) {
ModelAndView mav = new ModelAndView();
ErrorTO error = new ErrorTO("some error", -111);
mav.addObject("error",error );
TestTO test = new TestTO("some msg", -888);
mav.addObject("test", test);
mav.setViewName("test");
return mav;
}
//works for xml and json
@RequestMapping(value = "/test3", method = RequestMethod.GET)
public @ResponseBody ErrorTO test3(HttpServletRequest request, HttpServletResponse response) {
ErrorTO error = new ErrorTO();
error.setCode(-12345);
error.setMessage("this is a test error.");
return error;
}
//does not work for xml
@RequestMapping(value = "/testlist", method = RequestMethod.GET)
public @ResponseBody List<ErrorTO> testList2(HttpServletRequest request, HttpServletResponse response) {
ErrorTO error = new ErrorTO("an error", 1);
ErrorTO error2 = new ErrorTO("another error", 2);
ArrayList<ErrorTO> list = new ArrayList<ErrorTO>();
list.add(error);
list.add(error2);
return list;
}
In the two examples that can't produce xml, is it possible for configuring spring to make it work?
The two examples that don't generate XML aren't working because you have multiple top-level objects in your model. XML has no way to represent that - you need a single model object that can then be converted into XML. Similarly, a bare list cannot be converted into XML by Spring MVC.
In both cases, you need to wrap the various model objects into a single root object, and add that to the model.
JSON, on the other hand, has no issue with representing multiple top-level objects in a single document.