4. New Features and Enhancements in Spring 3.2

4.1 Overview of new features

4.1.1 Support for Servlet 3 based asynchronous request processing

The Spring MVC programming model now provides explicit Servlet 3 async support. @RequestMapping methods can return one of:

  • java.util.concurrent.Callable to complete processing in a separate thread managed by a task executor within Spring MVC.

  • org.springframework.web.context.request.async.DeferredResult to complete processing at a later time from a thread not known to Spring MVC, e.g. in response to some external event (JSM, AMQP, etc.)

  • org.springframework.web.context.request.async.AsyncTask to wrap a Callable and customize the timeout value or the task executor to use.

See Introducing Servlet 3 Async Support (SpringSource team blog).

4.1.2 Spring MVC Test framework

First-class support for testing Spring MVC applications with a fluent API and without a servlet container. Server-side tests involve use of the DispatcherServlet while client-side REST tests rely on the RestTemplate. See the following presentation for more information before documentation is added: "Testing Web Applications with Spring 3.2".

4.1.3 Content negotiation improvements

A ContentNeogtiationStrategy is now available for resolving the requested media types from an incoming request. The available implementations are based on path extension, request parameter, 'Accept' header, and a fixed default content type. Equivalent options were previously available only in the ContentNegotiatingViewResolver but are now available throughout.

ContentNegotiationManager is the central class to use when configuring content negotiation options. It accepts one or more ContentNeogtiationStrategy instances and delegates to them. It can be plugged into RequestMappingHandlerMapping, RequestMappingHandlerAdapter, ExceptionHandlerExceptionResolver, and ContentNegotiatingViewResolver. The MVC namespace and the MVC Java config provide convenient options to configure all that.

The introduction of ContentNegotiationManger also enables smart suffix pattern matching for incoming requests. See commit message

4.1.4 @ControllerAdvice annotation

Classes annotated with @ControllerAdvice can contain @ExceptionHandler, @InitBinder, and @ModelAttribute methods and those will apply to @RequestMapping methods across controller hierarchies as opposed to the controller hierarchy within which they are declared. @ControllerAdvice is a component annotation allowing implementation classes to be auto-detected through classpath scanning.

4.1.5 Matrix variables

A new @MatrixVariable annotation adds support for extracting matrix variables from the request URI. For more details see Section 17.3.2.5, “Matrix Variables”.

4.1.6 Abstract base class for code-based Servlet 3+ container initialization

An abstract base class implementation of the WebApplicationInitializer interface is provided to simplify code-based registration of a DispatcherServlet and filters mapped to it. The new class is named AbstractDispatcherServletInitializer and its sub-class AbstractAnnotationConfigDispatcherServletInitializer can be used with Java-based Spring configuration. For more details see Section 17.14, “Code-based Servlet container initialization”.

4.1.7 ResponseEntityExceptionHandler class

A convenient base class with an @ExceptionHandler method that handles standard Spring MVC exceptions and returns a ResponseEntity that allowing customizing and writing the response with HTTP message converters. This servers as an alternative to the DefaultHandlerExceptionResolver, which does the same but returns a ModelAndView instead.

See the revised Section 17.11, “Handling exceptions” including information on customizing the default Servlet container error page.

4.1.8 Support for generic types in the RestTemplate and in @RequestBody arguments

The RestTemplate can now read an HTTP response to a generic type (e.g. List<Account>). There are three new exchange() methods that accept ParameterizedTypeReference, a new class that enables capturing and passing generic type info.

In support of this feature, the HttpMessageConverter is extended by GenericHttpMessageConverter adding a method for reading content given a specified parameterized type. The new interface is implemented by the MappingJacksonHttpMessageConverter and also by a new Jaxb2CollectionHttpMessageConverter that can read read a generic Collection where the generic type is a JAXB type annotated with @XmlRootElement or @XmlType.

4.1.9 Jackson JSON 2 and related improvements

The Jackson Json 2 library is now supported. Due to packaging changes in the Jackson library, there are separate classes in Spring MVC as well. Those are MappingJackson2HttpMessageConverter and MappingJackson2JsonView. Other related configuration improvements include support for pretty printing as well as a JacksonObjectMapperFactoryBean for convenient customization of an ObjectMapper in XML configuration.

4.1.10 @RequestBody improvements

An @RequestBody or an @RequestPart argument can now be followed by an Errors argument making it possible to handle validation errors (as a result of an @Valid annotation) locally within the @RequestMapping method. @RequestBody now also supports a required flag.

4.1.11 HTTP PATCH method

The HTTP request method PATCH may now be used in @RequestMapping methods as well as in the RestTemplate in conjunction with Apache HttpComponents HttpClient version 4.2 or later. The JDK HttpURLConnection does not support the PATCH method.

4.1.12 Excluded patterns in mapped interceptors

Mapped interceptors now support URL patterns to be excluded. The MVC namespace and the MVC Java config both expose these options.

4.1.13 Support for @DateTimeFormat without Joda Time

The @DateTimeFormat annotation can now be used without needing a dependency on the Joda Time library. If Joda Time is not present the JDK SimpleDateFormat will be used to parse and print date patterns. When Joda time is present it will continue to be used in preference to SimpleDateFormat.

4.1.14 Global date & time formatting

It is now possible to define global formats that will be used when parsing and printing date and time types. See Section 7.7, “Configuring a global date & time format” for details.