ContentMappingService (interface)

interface ContentMappingService {
  Object map(Object object, final List<MediaType> acceptableMediaTypes)     (1)
1 map(Object, List)

Typically for mapping from a domain object to a DTO.


map(Object, List)

Typically for mapping from a domain object to a DTO.


The framework provides two implementations of this service, both to allow objects implementing HasCommandDto to be converted into serializable CommandDtos, in other words XML. This is used by the Command Log and Command Replay extensions to allow commands to be replicated from a primary to secondary system, for regression testing.

The implementations are:

  • will map any single instance of a HasCommandDto into a CommandDto XML document

  • will map a list of HasCommandDtos into a CommandsDto XML document, and will wrap any single instance of a CommandWithDto into a singleton list and thence into a CommandsDto XML document.

If the action invocation or property edit represent provides an implementation of a CommandDtoProcessor (by way of @Action#commandDtoProcessor() or @Property#commandDtoProcessor()) then this is also called to post-process the persisted CommandDto if required. A typical use case for this is to dynamically add in serialized Blobs or Clobs, the values of which are not captured by default in CommandDto.

To support the writing of custom implementations of this interface, the framework also provides ContentMappingService.Util which includes a couple of convenience utilities:

public static class Util {
    public static String determineDomainType(
        final List<MediaType> acceptableMediaTypes) { /* ... */ }
    public static boolean isSupported(
            final Class<?> clazz,
            final List<MediaType> acceptableMediaTypes) { /* ... */ }


The ContentMappingService supports the (default implementation of the) internal ContentNegotiationService SPI enabling the RestfulObjects viewer to represent domain objects in some other format as specified by the HTTP Accept header.

For its part, the (default implementation of the) ContentNegotiationService will check all available implementations of ContentMappingService to convert the domain object to the requested media type, rather than merely the first implementation found; in other words it uses the chain-of-responsibility pattern. Services are checked in the ordering defined by the Spring @Order annotation. The mapped object used will be the first non-null result returned by an implementation.

This service is a companion to the default implementation of the ContentNegotiationService.

The framework implementations of ContentMappingService use the MetaModelService to lookup any custom implementations of CommandDtoProcessor.