Spring has lots of ways of handling view and content resolution, which is probably a good thing since it gives you flexibility but sometimes it can be a bit problematic.
Full disclosure here I must admit I had never given much attention to all of the ways views could be resolved, usually I went with a ViewResolver for handling my views and that was it; until recently though...
For one of my projects I needed some custom JSON handling so I had defined a custom ViewResolver by extending spring's org.springframework.web.servlet.view.json.MappingJackson2JsonView and defined as the default implementation for handling JSON views like so :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
< bean class = "org.springframework.web.servlet.view.ContentNegotiatingViewResolver" > < property name = "contentNegotiationManager" ref = "contentNegotiationManager" > < property name = "order" value = "1" > < property name = "defaultViews" > < bean class = "com.ufasoli.CustomViewResolver" > < property name = "objectMapper" ref = "jacksonObjectMapper" > < property name = "exposePathVariables" value = "true" > < property name = "disableCaching" value = "false" > </ property ></ property ></ property ></ bean > </ property > </ property ></ property ></ bean > |
Everything was working as expected until I had to annotate some methods with @ResponseBody and now every method with this annotation was not being processed by my custom ViewResolver and I couldn't understand why..
As it turns out it's pretty simple (once you read the documentation again) when you annotate a method @ResponseBody spring will delegate the rendering of the view to a HttpMessageConverter and not a ViewResolver.
So to sum up :
Handler | When to use |
---|---|
ViewResolvers | when you are trying to resolve a view or the content you are trying to serve is in elsewhere(e.g. a controller method that returns the string "index" that will be mapped to the index.xhtml page) |
HttpMessageConverters | when you use the @ResponseBody annotations for returning the response directly from the method without mapping to an external file |
Can you share your views about predefined HttpMessageConverters??
ReplyDelete