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

Jasmin Jasko Merušić

我正在研究这个项目,我试图访问两个具有相同 URI 的不同控制器。在尝试运行它后,我收到了 BeanCreationException。因此,我在创建 bean 时遇到错误。我希望有办法解决这个问题。

我收到的错误消息:

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

我也在这个项目中使用 Thymleaf。我为这两个控制器使用的 URI:http://localhost:8080/api/overview。这两个控制器为我的 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 的新手。感谢您在高级方面的帮助。

安德烈·普洛特尼科夫

根据 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,否则没有办法允许第三个参数。此外,没有第三个参数。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

路线:一个uri,两个控制器。Laravel 8

Spring MVC控制器类中如何处理两个JSP表单页面

如何从Spring MVC的控制器类中返回两个列表

@WebMvcTest可以有两个控制器吗

两个或多个相互关联的模型可以在 rails 中使用一个公共控制器吗

是否可以将数据插入一个控制器内的两个不同表中

是否可以将相同的视图添加到两个不同的视图控制器?

是否可以在平均堆栈的单个控制器中制作两个模型?

是否可以通过蓝牙模块连接两个微控制器?

是否可以在两个隔离的指令之间共享控制器?

使用多个入口控制器-是否可以有一个“默认”控制器?

在 Java 中,是否可以在另一个类中使用一个类的元素/函数?

如何在Java Scene Builder上将两个参数作为XML传递给我的控制器类?

我可以使用一个控制器来更新AngularJS中的两个视图吗?

两个控制器在 Spring Boot 中具有不同的最大文件大小

是否有一个Java库可以验证URN?

是否可以使用ASP.NET MVC4的一个控制器功能在视图中返回两个数组?

是否可以在Gradle中声明一个可在Java中使用的变量?

是否可以在Java中定义一个变量并在JSP代码中使用该变量?

一个按钮可以有两个转场到两个不同的视图控制器/如何在没有转场的情况下编写视图控制器更改?

具有多个URI的Spring MVC控制器

在两个端口中启动Spring Boot REST控制器

Angularjs + spring引导(需要两个不同的控制器)

您可以从同一控制器内部调用两个Promise吗?

在一个控制器中为两个不同的表创建记录是否被认为是不好的做法?

Selenium / Java:是否可以将拖放动作分成两个属于两个单独类的动作?

如何使用Java查看两个矩形是否有一个相等的点?

是否有一个Java Map实现可以强制使用最终键?

是否可以使两个Java接口互斥?