gpt4 book ai didi

java - 在 Java Spring 中是否可以使用两个 Controller 类和一个 URI?

转载 作者:行者123 更新时间:2023-12-02 01:49:11 24 4
gpt4 key购买 nike

我正在开发这个项目,我试图使用相同的 URI 访问两个不同的 Controller 。尝试运行它后,我收到 BeanCreationException。所以我在创建 bean 时遇到了错误。我希望有办法解决这个问题。

我收到的错误消息:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'userController' method public java.lang.String com.javalanguagezone.interviewtwitter.controller.UserController.overview(java.security.Principal,org.springframework.ui.Model) to {[/overview],methods=[GET]}: There is already 'tweetController' bean method

我也在这个项目中使用 Thymleaf。我为这两个 Controller 提供的 URI:http://localhost:8080/api/overview.The两个 Controller 正在向我的 Thymleaf 页面提供我必须与刚才提到的 URI 同时呈现的信息。这样,我正在调用两个 Controller ,但我收到了前面提到的错误。

第一个 Controller 类(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 类是:

@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 的新手。感谢您提前提供的帮助。

最佳答案

根据 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...

但是这不能在两个不同的 Controller 中。指定 Controller 的唯一方法是通过 base-uri,参数不是其中的一部分。

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

或者,您可以使用具有映射功能的第三个 Controller ,当触发“/overview”端点时,该 Controller 会调用其他 2 个 Controller 。在这种情况下,您需要从推文和用户 Controller 中删除映射。

关于java - 在 Java Spring 中是否可以使用两个 Controller 类和一个 URI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53250401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com