I am trying to format my response content type on @RestController between json and xml. It seems to work in the case of an Accept header or path extension ( .json , .xml ). My application is packaged as a WAR and deployed to a tomcat instance. However, I am facing two problems at the moment.
1) Despite the fact that I set my default content type for JSON to ContentNegotiationConfigurer , a request like curl -X GET -H "Cache-Control: no-cache" http://localhost:8080/v1/api/version allows XML
2) When I use the parameter in the request, the content is resolved incorrectly. When accessing curl -X GET -H "Cache-Control: no-cache" http://localhost:8080/v1/api/version?format=json I get the XML back.
SpringBoot Application
@EnableAutoConfiguration @ComponentScan @Configuration @EnableWebMvc public class Application extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { builder.sources(Application.class); return super.configure(builder); } }
WebMvcConfigurerAdapter
@Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { private RequestMappingHandlerAdapter requestMappingHandlerAdapter; private CustomObjectMapper objectMapper; @PostConstruct public void init() { List<HttpMessageConverter<?>> messageConverters = requestMappingHandlerAdapter.getMessageConverters(); for (HttpMessageConverter<?> messageConverter : messageConverters) { if (messageConverter instanceof MappingJackson2HttpMessageConverter) { MappingJackson2HttpMessageConverter m = (MappingJackson2HttpMessageConverter) messageConverter; m.setObjectMapper(objectMapper); } } } @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer .defaultContentType(MediaType.APPLICATION_JSON) .favorParameter(true) .useJaf(false) .mediaType("xml", MediaType.APPLICATION_XML) .mediaType("json", MediaType.APPLICATION_JSON); super.configureContentNegotiation(configurer); } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper); converters.add(mappingJackson2HttpMessageConverter); converters.add(createXmlHttpMessageConverter()); super.configureMessageConverters(converters); } private HttpMessageConverter<Object> createXmlHttpMessageConverter() { MarshallingHttpMessageConverter xmlConverter = new MarshallingHttpMessageConverter(); XStreamMarshaller xstreamMarshaller = new XStreamMarshaller(); xmlConverter.setMarshaller(xstreamMarshaller); xmlConverter.setUnmarshaller(xstreamMarshaller); return xmlConverter; } @Autowired public void setRequestMappingHandlerAdapter(RequestMappingHandlerAdapter requestMappingHandlerAdapter) { this.requestMappingHandlerAdapter = requestMappingHandlerAdapter; } @Autowired public void setObjectMapper(CustomObjectMapper objectMapper) { this.objectMapper = objectMapper; } }
Rest controller
@RestController @RequestMapping("/v1/api") public class RestVersionController { @ResponseStatus(HttpStatus.OK) @RequestMapping(value = "/version", method = RequestMethod.GET) public @ResponseBody ApiVersion getVersion() { return new ApiVersion(1); } @JsonIgnoreProperties(ignoreUnknown = true) @XmlRootElement public static class ApiVersion { int version; String currentVersion = "Current version is "; public ApiVersion() { } public ApiVersion(int version) { this.version = version; this.currentVersion = this.currentVersion + version; } public ApiVersion(int version, String currentVersion) { this.version = version; this.currentVersion = currentVersion; } public int getVersion() { return version; } public void setVersion(int version) { this.version = version; } public String getCurrentVersion() { return currentVersion; } public void setCurrentVersion(String currentVersion) { this.currentVersion = currentVersion; } } }
Code @ Github Example
Any help is appreciated, thanks!
source share