3. Contact REST Code Example

The contact controller just needs to have an interface that extends PersistenceMarshallingService and a controller that implements that interface.

Example 3. PersonMarshallingService

The marshalling service extends PersistenceMarshallingService and defines all the paths for the controller as constants.

public interface PersonMarshallingService extends PersistenceContactMarshallingService<PersonResponse, PersonFindResponse, Person> {

    final static String PATH = "/person";

    public final static String FIND_BY_ID_REQUEST = PATH + PATH_DELIM + "{" + ID_VAR + "}";
    public final static String FIND_PAGINATED_REQUEST = PATH + PAGINATED;
    public final static String FIND_REQUEST = PATH;
    public final static String SAVE_REQUEST = PATH;
    public final static String UPDATE_REQUEST = FIND_BY_ID_REQUEST;
    public final static String DELETE_PK_REQUEST = FIND_BY_ID_REQUEST;
    public final static String DELETE_REQUEST = PATH;


Example 4. PersonController

The controller primarily delegates to it's service and also defines a @RequestMapping for each method.

public class PersonController extends AbstractController<Person, PersonResponse, PersonFindResponse>
        implements PersonMarshallingService {

    final Logger logger = LoggerFactory.getLogger(getClass());

    public PersonController(ContactService service) {

    @RequestMapping(value = FIND_BY_ID_REQUEST, method = RequestMethod.GET)
    public PersonResponse findById(@PathVariable(ID_VAR) Integer id) {
        logger.info("Find person.  id={}", id);

        return service.findById((int)id);

    @RequestMapping(value = FIND_PAGINATED_REQUEST, method = RequestMethod.GET)
    public PersonFindResponse find(@PathVariable(PAGE_VAR) int page,
                                   @PathVariable(PAGE_SIZE_VAR) int pageSize) {
        logger.info("Find person page.  page={}  pageSize={}", page, pageSize);

        return service.find(page, pageSize);

    @RequestMapping(value = FIND_REQUEST, method = RequestMethod.GET)
    public PersonFindResponse find() {
        logger.info("Find all persons.");

        return service.find();

    @RequestMapping(value = SAVE_REQUEST, method = RequestMethod.POST)
    public PersonResponse create(@RequestBody Person request) {
        Assert.isTrue(!isPrimaryKeyValid(request), "Create should not have a valid primary key.");

        logger.info("Save person.  id={}", request.getId());

        return service.create(request);

    @RequestMapping(value = UPDATE_REQUEST, method = RequestMethod.PUT)
    public PersonResponse update(@RequestBody Person request) {
        Assert.isTrue(isPrimaryKeyValid(request), "Update should have a valid primary key.");

        logger.info("Update person.  id={}", request.getId());

        return service.update(request);

    @RequestMapping(value = DELETE_PK_REQUEST, method = RequestMethod.DELETE)
    public PersonResponse delete(@PathVariable(ID_VAR) Integer id) {
        logger.info("Delete person.  id={}", id);

        return service.delete(new Person().withId(id));

    @RequestMapping(value = DELETE_REQUEST, method = RequestMethod.DELETE)
    public PersonResponse delete(@RequestBody Person request) {
        Assert.isTrue((request.getId() > 0), "Delete should have a valid primary key");

        int id = request.getId();

        return delete(id);