Reputation: 11
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
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