Adil Tokushev
Adil Tokushev

Reputation: 11

Spring Java how to use controller

I'm completely new to Spring framework. and I have a task to make phone book application on spring. I need to make registration and authorization and also my phone book. I have 2 controllers for that, first UserController that controls authorization and registration

@Controller
public class UserController {
@Autowired
private UserService userService;
@Autowired
private SecurityService securityService;
@Autowired
private UserValidator userValidator;

@RequestMapping(value = "/registration", method = RequestMethod.GET)
public String registration(Model model) {
    model.addAttribute("userForm", new User());
    return "registration";
}

@RequestMapping(value = "/registration", method = RequestMethod.POST)
public String registration(@ModelAttribute("userForm")
                                       User userForm, BindingResult bindingResult, Model model) {
    userValidator.validate(userForm, bindingResult);

    if (bindingResult.hasErrors()) {
        return "registration";
    }

    userService.save(userForm);

    securityService.autoLogin(userForm.getUsername(), userForm.getConfirmPassword());

    return "redirect:/welcome";
}

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login(Model model, String error, String logout) {
    if(error!=null) {
        model.addAttribute("error", "Username or password is incorrect.");
    }

    if (logout!=null) {
        model.addAttribute("message", "logged out successfully");
    }

    return "login";
}

@RequestMapping(value = {"/", "/welcome"}, method = RequestMethod.GET)
public  String welcome(Model model) {
    return "welcome";
}

@RequestMapping(value = "/admin", method = RequestMethod.GET)
public String admin(Model model) {
    return "admin";
}
}

and ContactController that controls my fuctionality(adding, removing, editing and shows contacts)

@Controller
public class ContactController {

private ContactService contactService;

@Autowired(required = true)
@Qualifier(value = "contactService")
public void setContactService(ContactService contactService) {
    this.contactService = contactService;
}

@RequestMapping(value = {"admin", "welcome"}, method = RequestMethod.GET)
public String listContactsForAdmin(Model model) {
    model.addAttribute("contact", new Contact());
    model.addAttribute("listContacts", this.contactService.listContacts());
    return "admin";
}
@RequestMapping(value = "admin/add", method = RequestMethod.POST)
public String addContact(@ModelAttribute("contact") Contact contact) {
    if (contact.getId() == 0) {
        this.contactService.addContact(contact);
    } else {
        this.contactService.updateContact(contact);
    }
    return "redirect:/admin";
}

@RequestMapping("/remove/{id}")
public String removeContact(@PathVariable("id") int id) {
    this.contactService.removeContact(id);

    return "redirect:/admin";
}

@RequestMapping("/edit/{id}")
public String editBook(@PathVariable("id") int id, Model model) {
    model.addAttribute("contact", this.contactService.getContactById(id));
    model.addAttribute("listContacts", this.contactService.listContacts());

    return "admin";
}

@RequestMapping("contactData/{id}")
public String contactData(@PathVariable("id") int id, Model model) {
    model.addAttribute("contact", this.contactService.getContactById(id));

    return "contactData";
}

}

when i try to authenticate or registr. new user I have such error:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path 'http://localhost:8087/admin': {public java.lang.String kz.adilka.springsecurity.app.controller.UserController.admin(org.springframework.ui.Model), public java.lang.String kz.adilka.springsecurity.app.controller.ContactController.listContactsForAdmin(org.springframework.ui.Model)}

it says that I have problem with mapping admin page. but for me it seems to be ok, or maybe I missed smth

Upvotes: 0

Views: 297

Answers (1)

flyingfox
flyingfox

Reputation: 13506

The reason is that you do not set the controller value for your controllers and they have the same RequestMapping method

@Controller // do not have identifier here
public class UserController {
      @Autowired
      private UserService userService;
      @Autowired
      private SecurityService securityService;
      @Autowired
      private UserValidator userValidator;


     @RequestMapping(value = "/admin", method = RequestMethod.GET)
     public String admin(Model model) {
       return "admin";
     }
}


@Controller // do not have identifier here
public class ContactController {

  private ContactService contactService;

  @RequestMapping(value = {"admin", "welcome"}, 
          method = RequestMethod.GET)
  public String listContactsForAdmin(Model model) {
    model.addAttribute("contact", new Contact());
    model.addAttribute("listContacts", 
    this.contactService.listContacts());
    return "admin";
  }

}

One possible solution is the set RequestMapping for each Controller method:

   @Controller(value = "user")
   public class UserController {
   @Autowired
   private UserService userService;
   @Autowired
   private SecurityService securityService;
   @Autowired
   private UserValidator userValidator;


   @RequestMapping(value = "/admin", method = RequestMethod.GET)
   public String admin(Model model) {
      return "admin";
   }
}


@Controller(value = "contact")
public class ContactController {

private ContactService contactService;

@RequestMapping(value = {"admin", "welcome"}, method = RequestMethod.GET)
public String listContactsForAdmin(Model model) {
    model.addAttribute("contact", new Contact());
    model.addAttribute("listContacts", this.contactService.listContacts());
    return "admin";
}

}

Upvotes: 0

Related Questions