我的 Spring boot 项目中有以下 Controller 类,分为接口(interface)和实现:
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 注解移动到界面时,它不起作用。但是在接口(interface)上注释方法是可行的。这两个注释有何不同?
最佳答案
@RestController
继承自 @Controller
,而 @Controller
又继承自 @Component,从而导致在应用程序上下文中创建 Spring Bean。
@RequestMapping
继承自 @Mapper
,用于将 Rest- 或 Web-Controller 方法标记为处理程序方法。
至于为什么 Spring 的实现不允许第一个继承而允许第二个继承,我只能推测:
- 我认为您的示例构成了
@Mapping
继承的有用用例,因为您可以拥有多个具有不同 url 前缀的 RestController,但除此之外具有相同的端点。 - 使
@Component
注解可继承可能会导致非自愿创建 Spring Bean,因为客户端在实现接口(interface)时可能无法注意到该注解。
关于java - 如何将Service/Controller层类拆分为interface和impl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52455268/