I am using MappingJacksonJsonView in my SpringMVC application to render JSON from my controllers. I want the ObjectId from my object to display as .toString, but instead it serializes the ObjectId in its part. It works great on my Velocity / JSP pages:
Velocity: $thing.id Produces: 4f1d77bb3a13870ff0783c25 Json: <script type="text/javascript"> $.ajax({ type: 'GET', url: '/things/show/4f1d77bb3a13870ff0783c25', dataType: 'json', success : function(data) { alert(data); } }); </script> Produces: thing: {id:{time:1327331259000, new:false, machine:974358287, timeSecond:1327331259, inc:-260555739},…} id: {time:1327331259000, new:false, machine:974358287, timeSecond:1327331259, inc:-260555739} inc: -260555739 machine: 974358287 new: false time: 1327331259000 timeSecond: 1327331259 name: "Stack Overflow" XML: <script type="text/javascript"> $.ajax({ type: 'GET', url: '/things/show/4f1d77bb3a13870ff0783c25', dataType: 'xml', success : function(data) { alert(data); } }); </script> Produces: <com.place.model.Thing> <id> <__time>1327331259</__time> <__machine>974358287</__machine> <__inc>-260555739</__inc> <__new>false</__new> </id> <name>Stack Overflow</name> </com.place.model.Thing>
Is there a way to stop MappingJacksonJsonView from getting such information from ObjectId? I just need the .toString () method, not all the details.
Thanks.
Adding Spring configuration:
@Configuration @EnableWebMvc public class MyConfiguration { @Bean(name = "viewResolver") public ContentNegotiatingViewResolver viewResolver() { ContentNegotiatingViewResolver contentNegotiatingViewResolver = new ContentNegotiatingViewResolver(); contentNegotiatingViewResolver.setOrder(1); contentNegotiatingViewResolver.setFavorPathExtension(true); contentNegotiatingViewResolver.setFavorParameter(true); contentNegotiatingViewResolver.setIgnoreAcceptHeader(false); Map<String, String> mediaTypes = new HashMap<String, String>(); mediaTypes.put("json", "application/x-json"); mediaTypes.put("json", "text/json"); mediaTypes.put("json", "text/x-json"); mediaTypes.put("json", "application/json"); mediaTypes.put("xml", "text/xml"); mediaTypes.put("xml", "application/xml"); contentNegotiatingViewResolver.setMediaTypes(mediaTypes); List<View> defaultViews = new ArrayList<View>(); defaultViews.add(xmlView()); defaultViews.add(jsonView()); contentNegotiatingViewResolver.setDefaultViews(defaultViews); return contentNegotiatingViewResolver; } @Bean(name = "xStreamMarshaller") public XStreamMarshaller xStreamMarshaller() { return new XStreamMarshaller(); } @Bean(name = "xmlView") public MarshallingView xmlView() { MarshallingView marshallingView = new MarshallingView(xStreamMarshaller()); marshallingView.setContentType("application/xml"); return marshallingView; } @Bean(name = "jsonView") public MappingJacksonJsonView jsonView() { MappingJacksonJsonView mappingJacksonJsonView = new MappingJacksonJsonView(); mappingJacksonJsonView.setContentType("application/json"); return mappingJacksonJsonView; } }
And my controller:
@Controller @RequestMapping(value = { "/things" }) public class ThingController { @Autowired private ThingRepository thingRepository; @RequestMapping(value = { "/show/{thingId}" }, method = RequestMethod.GET) public String show(@PathVariable ObjectId thingId, Model model) { model.addAttribute("thing", thingRepository.findOne(thingId)); return "things/show"; } }