我正在尝试在我的应用程序中配置多个控制器,并尝试从一个控制器重定向到另一个控制器。
错误:
org.springframework.beans.factory.BeanCreationException:创建名称为' org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0':init方法的调用失败;嵌套异常是java.lang.IllegalStateException:找到了不明确的映射。无法映射' nc'豆方法。
编辑:
第一个控制器
@Controller
@RequestMapping(value = "/nc")
public class StockController {
@RequestMapping(value = "/testMap", method = RequestMethod.GET)
public String redirectToStockList(@RequestParam(value = "testInput") String testInput) {
System.out.println("In StockController..!!");
return "SampleTamplate";
}
}
第二个控制器
@Controller
public class WelcomeController {
@Autowired
private UsersServiceImpl serviceImpl;
private String redirectedURL;
private static final Logger logger = LoggerFactory
.getLogger(WelcomeController.class);
@RequestMapping(value = { "/", "/login" }, method = RequestMethod.GET)
public String login(@RequestParam(value = "username") String username) {
logger.debug("In login() method.");
System.out.println("In WelcomeController..!!");
return "Login";
}
}
JSP:
第一种形式:
<form action="testMap" method="post">
<input type="text" class="form-control" name="testInput"/>
</form>
第二表格:
<form action="login" method="post">
<input type="text" class="form-control" name="username"/>
</form>
当我逐个提交两个表单时,控制权转到“欢迎控制器”&#39;每次。对于第一种形式,它提供了未找到的资源&#39;错误,因为没有映射存在&#34; / testMap&#34;在欢迎控制器。
所以我想要的是,在我的表单提交上调用特定的控制器,并从另一个控制器调用一个控制器的方法。
任何帮助都将不胜感激。
答案 0 :(得分:1)
在下面的示例中,如果在通过调用位于其中的 menuMapping()方法提交登录表单时存在验证错误,则LoginController会重定向到 / menu URL MenuController类。
(注意:我已经包含了 BindingResult 类和假设形式的使用,因为这是想要重定向到另一个控制器的正当理由。但是,以下解决方案仍然可以正常工作没有BindingResult和if语句而没有使用表单)。
@Controller
public class LoginController {
MenuController menuController;
@RequestMapping(value = "/login")
public String loginMapping(BindingResult result){
if(result.hasErrors) {
return "login";
}
else {
return menuController.menuMapping();
}
}
将MenuController放在另一个类中,如下所示:
@Controller
public class MenuController {
@RequestMapping(value = "/menu")
public String menuMapping(){
return "menu";
}
}
(编辑:如果你想应用重定向并且控制器方法在同一个类中,则loginMapping返回语句只是return menuMapping();
而不是return menuController.menuMapping();
答案 1 :(得分:1)
我将尝试用Grails和Spring方式回答这个问题,因为这是在这里介绍Grails的最佳时机。
在春天,当呼叫从控制器离开时,RequestDispatcher实际上有助于捕获呼叫或检查确切的视图解析器。现在,因为你想将调用转移到另一个控制器,sping提供API(http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-redirecting)Inshort你必须使用像“forward:controllerName”这样的视图名称,如
@RequestMapping({"/someurl"})
public String execute(Model model) {
if (someCondition) {
return "forward:/someUrlA";
} else {
return "forward:/someUrlB";
}
在grails中,您可以在控制器API中找到适合您的前向方法(http://grails.github.io/grails-doc/2.0.4/api/org/codehaus/groovy/grails/plugins/web/api/ControllersApi.html)。它实际上将同一会话传递给下一个请求的控制器。
请求您尝试使用它。希望这有帮助。