Spring MVC:在另一个控制器中自动装配一个控制器

fai*_*izi 1 java spring spring-mvc

我有两个LoginViewController控制器UserViewController

@Controller
public class LoginViewController {

    @Autowired
    private UserViewController userViewController;  //Can't autowire, since spring creates a proxy for UserViewController class

    @RequestMapping(value="/login", method=POST)
    public String login(){

        //username and password checking etc

        if(login_successfull){
            //When login successfull, i need to redirect the screen to user dashboard  
            model.addAttribute("loginMessage", "You are loggined successfully")
            return userViewController.viewDashboard(userId);
        }   
    }
}

@Controller
@RequestMapping("/user")
public class UserViewController {

    @Autowired 
    private UserService userService;

    @RequestMapping(value="/dashboard", method=GET)
    public String viewDashboard(Model model, @RequestParam(value="id", required=true) Long userId){
        //Fetch and send user details to dashboard
        model.addAttribute("user", userService.get(userId));
        return "userDashboard"; 
    }
}
Run Code Online (Sandbox Code Playgroud)

用户登录成功后,我需要将屏幕重定向到用户仪表板,并显示登录成功消息。

为此可以使用两种方法

  1. 由于我有一种方法来加载用户仪表板UserViewController,所以我自动UserViewController连接了LoginViewController,这导致NoSuchBeanDefinitionException,因为 spring 创建了一个代理UserViewController

  2. 我可以使用redirect/forward路由到用户仪表板作为返回"redirect:/user/dashboard?id=123"。但是当我更改方法的 url 时viewDashboard(),我需要识别并更正所有redirect/forward语句。

那么,有没有办法调用UserViewController.viewDashboard()fromLoginViewController呢?我正在使用 spring 3.1.4 和 thymeleaf

Jas*_*son 6

如果您希望控制器的输出将用户发送到另一个控制器,您可以执行“重定向”:

if(login_successfull){
    //When login successfull, i need to redirect the screen to user dashboard  
    model.addAttribute("loginMessage", "You are loggined successfully")
    return "redirect:/user/dashboard";
}
Run Code Online (Sandbox Code Playgroud)

如果您决定更改控制器的 URL,则需要替换站点中的所有 HTML 链接。如果您已经在进行全局搜索/替换,那么您也应该能够找到重定向实例。

或者,您可以尝试以下操作:

public class UrlConstants {
    public static final String USER_PATH = "/user";
    public static final String DASHBOARD_PATH = "/dashboard";
}
Run Code Online (Sandbox Code Playgroud)

然后你改变你的控制器:

@Controller
@RequestMapping(UrlConstants.USER_PATH)
public class UserViewController {
    ...
    @RequestMapping(value=UrlConstants.DASHBOARD_PATH, method=GET)
Run Code Online (Sandbox Code Playgroud)

然后进行重定向:

return "redirect:" + UrlConstants.USER_PATH + UrlConstants.DASHBOARD_PATH;
Run Code Online (Sandbox Code Playgroud)