TL;博士
@RestController
实施接口@Transactional
长篇故事:
我正在使用Spring Boot和Spring MVC来提供RESTful Web服务。我有一个@RestController
类实现了一个接口,该接口具有所有@RequestMapping
注释,可以更好地了解端点的位置并映射到哪些控制器方法。
@RestController
public class UserController extends AbstractController implements IUserController {
...
}
@RequestMapping("/blub/user/")
public interface IUserController {
@RequestMapping(value = "showEditUser/{id}", method = { RequestMethod.GET })
public ShowEditUserResponse showEditUser(final Long userId);
...
}
一切都很好。在Startup上我得到了一堆日志消息,如:
Mapped "{[/blub/user/updateUser],methods=[PUT]}" onto public org.blub.core.rest.model.user.UpdateUserResponse org.blub.server.controller.impl.UserController.updateUser(org.blub.core.rest.model.user.UpdateUserRequest)
然后我将@Transactional
添加到Controller的实现中(也尝试了接口)。现在,logmessage发生了变化:
Mapped "{[/blub/user/updateUser],methods=[PUT]}" onto public org.blub.core.rest.model.user.UpdateUserResponse org.blub.server.controller.IUserController.updateUser(org.blub.core.rest.model.user.UpdateUserRequest)
请注意,邮件会从impl.UserController
更改为IUserController
,这会在调用URI时产生404 HTTP状态。
当我将所有@RequestMapping
注释移动到实现并删除整个接口时,一切都按预期工作。
为什么有一个接口导致这种麻烦?我认为特别是在涉及基于AOP的代理时,接口是“必须拥有的”?!
答案 0 :(得分:1)
我遇到了同样的问题,我的项目也使用javamelody,whitch是一个使用代理的监控库。
禁用它后,我的休息终点恢复了生机。 所以问题可能与spring mvc和代理库之间的代理干扰有关。