Можно ли использовать два класса контроллера с одним URI в Java Spring? - PullRequest
0 голосов
/ 11 ноября 2018

Я работаю над этим проектом, где я пытаюсь получить доступ к двум разным контроллерам с одним и тем же URI. После попытки запустить его я получаю исключение BeanCreationException. Так получается, что я получаю ошибку при создании компонента. Я надеюсь, что есть способ справиться с этим.

Сообщение об ошибке, которое я получаю:

org.springframework.beans.factory.BeanCreationException: ошибка создание компонента с именем 'requestMappingHandlerMapping', определенным в ресурс пути к классу [Орг / springframework / загрузки / Автоконфигурирование / веб / WebMvcAutoConfiguration $ EnableWebMvcConfiguration.class]: Ошибка вызова метода init; вложенное исключение java.lang.IllegalStateException: неоднозначное отображение. Невозможно отобразить Метод 'userController' публичный java.lang.String com.javalanguagezone.interviewtwitter.controller.UserController.overview (java.security.Principal, org.springframework.ui.Model) to {[/ Overview], method = [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";
}    }

Мой вопрос : есть ли способ исправить это, или я ищу другой путь? Я относительно новичок с весны. Спасибо за вашу помощь в продвинутом.

1 Ответ

0 голосов
/ 11 ноября 2018

в соответствии с соглашениями REST, у вас должен быть не / обзор, а / пользователь / обзор. Вы можете установить его, указав @RequestMapping ("/ user") в вашем userController.

Точно так же у вас будет конечная точка "/ твит / обзор".

@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 вручную, чтобы разрешить третий параметр в этом случае. Также нет третьего параметра.

В качестве альтернативы, у вас может быть третий контроллер с Mapping, который вызывает два других контроллера при срабатывании конечной точки "/ Overview". В этом случае вам нужно удалить сопоставление из твитов и пользовательских контроллеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...