当前位置: 首页 > 知识库问答 >
问题:

Spring Java如何使用控制器

吕岳
2023-03-14

我对Spring框架是完全陌生的。我有一个任务是在Spring上制作电话簿应用程序。我需要登记和授权,还有我的电话簿。我有两个控制器,第一个是控制授权和注册的UserController

@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";
}
}
@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";
}

当我尝试进行身份验证或注册时。新用户我有这样的错误:

NestedServletException:请求处理失败;嵌套异常是java.lang.IllegalStateException:映射到HTTP路径“HTTP://localhost:8087/admin”的处理程序方法不明确:{public java.lang.string kz.adilka.springsecurity.app.controller.usercontroller.admin(org.springframework.ui.model),public java.lang.string

它说,我有问题与映射管理页。但对我来说似乎还可以,或者我错过了smth

共有1个答案

卫焕
2023-03-14

原因是您没有为控制器设置控制器值,并且它们具有相同的RequestMapping方法

@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";
  }

}

一个可能的解决方案是为每个控制器方法设置RequestMapping:

   @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";
}

}
 类似资料:
  • 问题内容: 如何使用TypeScript定义我的控制器。到目前为止,它在angular js中,但是我想更改为type script。以便可以快速检索数据。 问题答案: 我决定通过工作示例添加另一个答案。这是非常简单的版本,但应该显示所有的基本如何向我们 和 。 有一个工作的家伙 这将是我们扮演服务器的角色。 这将是我们的启动模块: 所以以后我们可以使用module 。这就是我们的index.ht

  • 源代码控制系统(又称版本控制系统)让你高效地管理工程。他们对一个人是很有用的,对一个团队是至关重要的。它们追踪不同版本里的所有改变,以至于所有代码都未曾丢失,其含义可以归属于改变。有了源代码控制系统,一个人可以自信地写一些而半途而废的代码和调试的代码,因为你修改的代码被仔细地与提交的、官方的即将与团队共享或发布的代码分割开。 我挺晚才开始意识到源代码控制系统的好处,但现在即使是一个人的工程,我也不

  • 我有下一个Rest控制器 我将Spring Security用于以下配置: 我想为我的控制器编写单元测试。我写了下一个测试,但是它们工作得不好: 当我开始测试时,我得到了状态404。如果在安全配置中删除@EnableGlobalmetodSecurity(prePostEnable=true),测试正在工作,但不工作@PreAuthorize。我有一些问题: 如果prespenabled=true

  • 我一直在尝试将文件从rest客户端发送到我的spring控制器。在控制器中,我使用“@requestParam(“file”)MultipartFile file”从客户端获取文件,并使用REST服务注释进行注释,如下所示 我总是得到415媒体类型不支持。在上面的方法中,如果我不给多部分,它给我的结果是完成了,但不是多部分。 所以我可以知道如何发送文件到我的Spring控制器?

  • 我试图通过AWS负载平衡器公开在kubernetes集群中运行的应用程序。我遵守了文件https://cloudyuga.guru/blog/cloud-controller-manager直到我在kubeadm中添加了云提供者=外部。conf文件。但这份文档是基于数字海洋云的,我正在从事AWS的工作,我很困惑是否需要运行任何部署。yaml文件以使处于挂起状态的吊舱运行,如果是,请提供链接,我现在

  • 问题内容: 我写了一个过滤器函数,它将根据您传递的参数返回数据。我希望控制器具有相同的功能。是否可以在控制器中重用过滤器功能? 到目前为止,这是我尝试过的: 问题答案: 将 $ filter 注入控制器 然后,无论您想在哪里使用该过滤器,都可以像这样使用它: 如果要将参数传递给该过滤器,请使用单独的括号进行处理: 您要过滤的数组在哪里,并且是用于过滤的对象。