【问题标题】:Is it possible to use two controller classes with one URI in Java Spring?是否可以在 Java Spring 中使用具有一个 URI 的两个控制器类?
【发布时间】:2018-11-11 15:46:59
【问题描述】:

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

我得到的错误信息:

org.springframework.beans.factory.BeanCreationException: 错误 创建名称为“requestMappingHandlerMapping”的bean 类路径资源 [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: 调用 init 方法失败;嵌套异常是 java.lang.IllegalStateException:不明确的映射。无法映射 'userController' 方法 public 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的新手。感谢您在高级方面的帮助。

【问题讨论】:

  • 您不能从同一个 uri 调用两个相同的映射控制器。这就是您得到不明确映射的原因。您应该更改两个控制器的端点。

标签: java spring controller uri


【解决方案1】:

根据 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”端点被触发时调用其他 2 个控制器。在这种情况下,您需要从推文和用户控制器中删除映射。

【讨论】:

  • 感谢您的快速响应,但现在我必须有两个不同的 URI 才能调用 Controller 类吗?我的意思是我只需要一个 URI 就需要控制器提供两种不同的东西。有办法解决吗?
  • 如果我让你带一个苹果,篮子里有两个:一个是金的,一个是绿色的,你知道是哪一个吗?除非你指定哪一个,否则你不能:)
  • 再次感谢您为我解惑。因此,如果我在我的 UserController 中创建 TweetService 的实例,然后调用 TweetService 类中的方法,当然还有 UserService 方法,那么它会起作用。
  • 如果你想合并它们,你最好有单独的控制器。比如,GeneralController,对于这样的方法。我这么说,因为如果你确实需要这样做,那么设计就有问题。我不知道为什么你不能使用 /user/overview 端点,但是设计是个问题
  • 我明白了,我将通过合并来完成,因为它更清晰,然后通过一个端点,我将从 TweetService 和 UserService 获取服务。
猜你喜欢
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多