Как разделить классы слоя Service / Controller на интерфейс и импл? - PullRequest
0 голосов
/ 22 сентября 2018

В моем загрузочном проекте Spring есть следующий класс контроллеров, разделенный на интерфейс и реализацию:

public interface UserAccountController {

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String login(@RequestBody UserAccountEntity account,
            HttpServletResponse response) throws IOException;

    @RequestMapping(value = "/signup", method = RequestMethod.POST)
    public String create(@Valid @RequestBody UserAccountEntity userAccount,
            HttpServletResponse response, BindingResult result);

}

@RestController
@RequestMapping("/api/authentication")
public class UserAccountControllerImpl implements UserAccountController {

    @Autowired
    private UserAccountService userAccountService;

    @Override
    public String login(@Valid @RequestBody UserAccountEntity account,
            HttpServletResponse response) throws IOException {
            //...
    }

    @Override
    public String create(@Valid @RequestBody UserAccountEntity userAccount,
            HttpServletResponse response, BindingResult result) {
            //....
    }
}

Когда я перемещаю аннотации RestController и RequestMapping в интерфейс, он не работает.Но аннотирование методов на интерфейсе работает.Чем эти две аннотации отличаются?

1 Ответ

0 голосов
/ 22 сентября 2018

@RestController наследуется от @Controller, который наследуется от @Component, что приводит к созданию Spring Bean в контексте вашего приложения.

@RequestMapping наследуется от @Mapper и используется для пометкиМетоды Rest- или Web-Controller как методы-обработчики.

Относительно того, почему Spring реализован так, чтобы запретить наследование для первого и разрешить его для второго, я могу только предполагать:

  • Я думаю, что ваш пример представляет собой полезный сценарий использования для наследования @Mapping, поскольку у вас может быть несколько RestController с разными префиксами url, но кроме этого одинаковые конечные точки.
  • Создание @Component наследуемых аннотаций может привести к непреднамеренному созданию Spring Beans, поскольку клиенты могут не заметить аннотацию при реализации интерфейса.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...