在Java Spring中是否可以对一个URI使用两个控制器类?

时间:2018-11-11 15:46:59

标签: java spring controller uri

我正在从事这个项目,我试图在其中使用相同的URI访问两个不同的控制器。尝试运行它后,我得到了BeanCreationException。 所以碰巧我在创建bean时遇到错误。 我希望有办法解决这个问题。

我收到的错误消息:

  

org.springframework.beans.factory.BeanCreationException:错误   创建名称为“ requestMappingHandlerMapping”的bean   类路径资源   [org / springframework / boot / autoconfigure / web / WebMvcAutoConfiguration $ EnableWebMvcConfiguration.class]:   调用init方法失败;嵌套异常为   java.lang.IllegalStateException:模棱两可的映射。无法映射   'userController'方法公共java.lang.String   com.javalanguagezone.interviewtwitter.controller.UserController.overview(java.security.Principal,org.springframework.ui.Model)   到{[/ overview],methods = [GET]}:已经有'tweetController'   豆方法

我正在为此项目使用Thymleaf。我为这两个控制器提供的URI:http://localhost:8080/api/overview.The两个控制器为我的Thymleaf页面提供了我必须同时使用刚才提到的URI呈现的信息。这样,我同时调用了两个控制器,但是遇到了前面提到的错误。

第一个控制器类(TweetController):

@Controller
@Slf4j
public class TweetController {

private TweetService tweetService;

public TweetController(TweetService tweetService) {
this.tweetService = tweetService;
}
@GetMapping( "/overview")
public String tweetsFromUser(Principal principal, Model model) {

model.addAttribute("tweets",tweetService.tweetsFromUser(principal).size());
return "api/index";

}
}

第二个控制器类是:

@Controller
public class UserController {

private UserService userService;

public UserController(UserService userService) {
 this.userService = userService;
 }

@GetMapping("/followers")
public String followers(Principal principal) {
userService.getUsersFollowers(principal);
return "api/index";
}

@GetMapping("/following")
public int following(Principal principal) {
return userService.getUsersFollowing(principal);
}

@GetMapping("/overview")
public String overview(Principal principal, Model model){

model.addAttribute("followers",userService.getUsersFollowers(principal));
model.addAttribute("following",userService.getUsersFollowing(principal));
return "api/index";
}    }

我的问题:是否可以解决该问题,或者我正在寻找另一种解决方法?我是Spring的新手。多谢您的协助。

1 个答案:

答案 0 :(得分:2)

根据REST约定,您不应具有/ overview,而应具有/ user / overview。您可以通过在userController中提供@RequestMapping(“ / user”)来进行设置。

以同样的方式,您将拥有“ / tweet / overview”端点。

@Controller
@Slf4j
@RequestMapping("/tweet")
public class TweetController {

以任何其他方式进行操作都违反了约定,违反了Spring规则,这可能意味着您做错了事。 Spring不允许使用具有相同uri的两个方法,因为它不知道您确切想调用哪个方法。

upd:如果需要逻辑,可以将参数发送到GET:/ overview?customParam = user

@GetMapping( "/overview")
public String tweetsFromUser(@RequestParam(value="customParam") String 
param, Principal principal, Model model) {
// logic checking customParam...

但是不能在两个不同的控制器中。指定控制器的唯一方法是通过base-uri,而参数不属于该控制器。

Spring通过2个参数确定方法:映射和HTTP方法。在这种情况下,除非手动修改Spring,否则没有办法允许第3个参数。而且,没有第三个参数。

或者,您可以具有第三个带有“映射”的控制器,当“ / overview”端点被触发时,它将调用其他两个控制器。在这种情况下,您需要从tweet和用户-控制器中删除映射。