【问题标题】:How to split Service/Controller layer classes into interface and impl?如何将服务/控制器层类拆分为接口和实现?
【发布时间】:2018-09-22 09:21:07
【问题描述】:

我的 Spring Boot 项目中有以下控制器类,分为接口和实现:

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 注释移动到接口时,它不起作用。但是在接口上注释方法是有效的。这两个注释有何不同?

【问题讨论】:

    标签: java spring-boot


    【解决方案1】:

    @RestController 继承自 @Controller,后者继承自 @Component,从而导致在您的应用程序上下文中创建 Spring Bean。

    @RequestMapping 继承自 @Mapper,用于将 Rest- 或 Web-Controller 方法标记为处理程序方法。

    至于为什么Spring实现了第一个不允许继承,第二个允许继承,我只能推测:

    • 我认为您的示例构成了@Mapping 继承的有用用例,因为您可以有多个具有不同 url 前缀的 RestController,但除了相同的端点。
    • 使@Component 注解可继承可能会导致非自愿创建的 Spring Beans,因为客户端在实现接口时可能无法注意到注解。

    【讨论】:

      猜你喜欢
      • 2014-07-07
      • 2011-05-25
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多