概述:
今天在使用spring boot框架的时候,踩了一个坑,是关于control层request body依赖注入的问题的,内容如下:
进过:
由于目前公司采用的系统架构,要求把springboot的control层,以接口的形式单独暴露出入,而具体control层的代码,则放在另一个包里实现。这种把control层以接口方式实现的方式,导致了我今天在使用spring boot的@RequestBody的注解的时候,出了问题。
根据我之前的经验,我是把control层的相关注解,都放在了接口类里。包括@RequestMapping、@Valid等,一路开发下来也没什么问题,GET请求都能正常收到。可是到了写POST的时候,出现问题了。一开始我是把@RequestBody放在接口类里的方法参数前的,可是这样就导致了所有传过来的body里的请求都注入不到参数对象里。后来经过很长时间的折腾,终于发现,把这个参数放在实现类里的方法参数前,就能接到传过来的数据了。而我又测了下,想把@Valid参数也放到实现方法的参数前,却发现这样不行,程序会报错。我猜测,可能是和2个注解的处理时机有关。@Valid方法应该是在接口实现前,就对参数进行了处理。而@RequestBody方法,则是在接口实现后,才对方法参数进行注入。
总结:
如果对spring boot的control层进行接口分类,@RequestBody注解要写在实现类里
示例代码:
接口类:
/** * 发表评论 * * @param commentAddVo 发表评论的内容VO * @return 执行结果 */ @RequestMapping(method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, value = "/add") Result<Boolean> addComment(@Valid @RequestBody CommentAddVo commentAddVo);
实现类:
@Override public Result<Boolean> addComment(@RequestBody CommentAddVo commentAddVo) { //todo 这里info日志加用户id log.info("CommentFacade addComment entrance:userId"); log.debug("CommentFacade addComment entrance:"+ commentAddVo); return ResultHelper.succeed(true); }