jay
jay

Reputation: 153

Spring MVC, Controllers design

I am building a web application in Spring MVC with combination of Spring Security. My question regards to inner design of application. To be more specific - how to set up controllers. I got inspired a lot by Pet Clinic example where there is one controller per domain object (Owner controller, Pet controller, Vet Controller and so on).

I would like to introduce an admin backend interface to my application. This would mean to create admin - specific methods and @RequestMappings in each controller. Request mapping paths are secured by intercept-url pattern so I do not have to care where they are. However I find this solution little bit inelegant.

On pet clinics example would it look like:

@Controller
@SessionAttributes(types = Owner.class)
public class OwnerController {

   private final ClinicService clinicService;

   // Front end method
   @RequestMapping(value = "/owners/find", method = RequestMethod.GET)
   public String initFindForm(Map<String, Object> model) {
      model.put("owner", new Owner());
      return "owners/findOwners";
   }


   // Admin method
   @RequestMapping(value = "/admin/owners/find", method = RequestMethod.GET)
   public String initFindForm(Map<String, Object> model) {
       model.put("owner", new Owner());
   //Admin view
       return "admin/owners/findOwners";
  }

}

Other choice is to have one controller for each @RequestMapping (or per action)

 @Controller
 @RequestMapping(value = "/admin", method = RequestMethod.GET)
 public class AdminController {

    private final ClinicService clinicService;

    // Admin method
    @RequestMapping(value = "/owners/find", method = RequestMethod.GET)
    public String initFindForm(Map<String, Object> model) {
        model.put("owner", new Owner());
        //Admin specific view
        return "admin/owners/findOwners";
    }

  }

This would in my opinion lead to really robust controllers with many methods.

Third option would be to have some kind of mix of those.

  @Controller
  @SessionAttributes(types = Owner.class)
  public class AdminOwnerController {

    private final ClinicService clinicService;

    // Admin method
    @RequestMapping(value = "/admin/owners/find", method = RequestMethod.GET)
    public String initFindForm(Map<String, Object> model) {
        model.put("owner", new Owner());
       //Admin view
       return "admin/owners/findOwners";
}

}

My question is what is a standard approach for that?

Upvotes: 0

Views: 355

Answers (1)

Nils
Nils

Reputation: 1750

Usually I use a hybrid approach of AdminOwnerController, in which I end up having approximately 5-10 methods max per Controller.

If you end up having 1-2 methods per controller. I would consider grouping them together based on the admin domain.

Upvotes: 1

Related Questions