I needed to use MarshallingHttpMessageConverter (so @RequestBody could bind a POST of XML to a POJO). AnnotationMethodHandlerAdapter is preconfigured in its constructor with several MessagConverters, but not MarshallingHttpMessageConverter. Using the <mvc:annotation-config/> tag, it was nearly impossible to add this MessageConverter to the AMHA. Per Spring Support, I had to write a BeanPostProcessor to look for the AMHA and then add the MTHC (and to add insult to injury, it was an array!).

There should be a simpler way to add MessageConverters; in fact, if they are found in the application context they should be added automatically, or they should be added via the mvc:annotation-config. Or anything more elegant than the BeanPostProcessor.

Also section 19.9 of the reference document implies that MarshallingHttpMessageConverter is configured by default, but it's not.

Added proposed patch (Git) to be reviewed by Arjen. I added a setter for custom HttpMessageConverter<?> that will be prepended to the default ones, just like you already can do with custom WebArgumentResolver.

I tried to use the above with the current 3.1.0.BUILD-SNAPSHOT but to no avail...
Starting up the application causes a
org.xml.sax.SAXParseException: cvc-complex-type.2.1: Element 'mvc:annotation-driven' must have no character or element information item [children], because the type's content type is empty.

I assume that using the 3.0 schemas is causing this issue but I couldn't find the location of the new 3.1 schemas anywhere.
Any idea how to work around this?

The schemas are in the jar. They don't need to be available at the URI specified in the schema location. Just make sure your schema location in the <beans> element points to spring-mvc.xsd (or spring-mvc-3.1.xsd) and not spring-mvc-3.0.xsd.

Instead of always overriding the list of default converters, forcing people to know what the defaults are exactly so that they can list them again if they only want to register one or two extra converters, why don't we add an attribute like "appendToDefaults" to the message-converters element?
In general I would like to see Spring to offer more support for keeping defaults, as very often more items are added to the default list of mvc-related components with new framework versions and I don't always want to have to keep track of that as I update my applications to benefit from them (Formatters, Converters, HttpMessageConverters, HandlerMappings, HandlerAdapters, etc). Also, the defaults sometimes include smart classpath checking for things like Jackson and Rome, which are not available to me as a simple user using this namespace: being able to append to the defaults would be much simpler.

What we could do is place user-provided message converters in front of the default ones. So whether your provide a completely new JSON converter or an instance of say MappingJacksonHttpMessageConverter configured in a slightly different way, in both cases your converter would override or take precedence over the default ones.

With this there needs to be a way to turn off default message converter registrations entirely. That we could do through a "register-defaults" attribute on the <mvc:message-converters> element, which would be set to true by default.