我的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注释移至该接口时,它不起作用。但是在接口上注释方法是可行的。这两个注释有何不同?
答案 0 :(得分:1)
@RestController
继承自@Controller
,后者继承自@Component,从而导致在应用程序上下文中创建Spring Bean。
@RequestMapping
继承自@Mapper
,用于将Rest-或Web-Controller方法标记为处理程序方法。
关于为什么实施Spring来禁止继承第一个继承,而允许第二个继承,我只能推测:
@Mapping
继承提供了一个有用的用例,因为您可能有多个带有不同URL前缀的RestController,但端点相同。 @Component
注释可继承可能导致非自愿创建的Spring Bean,因为客户端在实现接口时可能无法注意到注释。