Spring MVC DispatcherServlet改造为 CSE RestServlet 常见问题汇编

liubao68 发表于 2018/11/13 14:29:58 2018/11/13
【摘要】 本文是使用CSE RestServlet替换Spring MVC DispatcherServlet常见问题汇总。

将Spring Boot的REST应用改造为CSE的REST应用的核心部分就是使用CSE RestServlet替换Spring MVC DispatcherServlet。有很多文章介绍了相关工作量评估、替换原理、改造步骤等。比如:

[改造原理和步骤] 在Spring Boot中使用CSE

[改造工作量评估] 微服务改造设计参考

[改造步骤和实践] 基于Spring Boot 2.0的IoT应用集成和使用CSE实践


本文主要是常见问题汇总。


--------------------------------------

问题摘要:使用RequestMapping定义多个Path

问题描述:

@RequestMapping(value = {"/v3-ext/agencies", "/v3-huawei/agencies", "/v3.0/OS-AGENCY/agencies"},
                    method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
public Map<String, Object> listAgency(@RequestParam("domain_id") String domainId)

以上接口定义了多个Path。在CSE中,一个接口只能允许一个Path,并且必须存在唯一的operation id。默认情况下operation id就是方法名。

错误日志:


解决建议:

可以将一个接口拆分为多个接口。

@RequestMapping(value = {"/v3-ext/agencies"},
                    method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
public Map<String, Object> listAgency1(@RequestParam("domain_id") String domainId)

@RequestMapping(value = {"/v3.0/OS-AGENCY/agencies"},
                    method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
public Map<String, Object> listAgency2(@RequestParam("domain_id") String domainId)

--------------------------------------


问题摘要:不支持在接口参数里面使用HttpServletResponse

问题描述:

@RequestMapping(value = "/v3/groups/{group_id}/users/{user_id}", method = RequestMethod.HEAD, produces = "application/json;charset=UTF-8")
public void isUserOfGroup(@PathVariable("group_id") String groupId,
                          @PathVariable("user_id") String userId, HttpServletResponse response)

以上接口使用了HttpServletResponse作为接口参数。CSE的通信层与编码层是完全解耦的,业务代码不能直接操作通信层的响应。另外,CSE要求所有接口都需要有明确的定义(即契约,swagger),开发的时候,接口定义即文档。


错误日志:


解决建议:

这种情况需要试业务逻辑进行分析,将操作response的内容抽取为响应值。比如:

response.setStatus(resultCode)

这种代码只是想设置响应的错误码,可以替换为下面的方式:

@RequestMapping(value = "/v3/groups/{group_id}/users/{user_id}", method = RequestMethod.HEAD, produces = "application/json;charset=UTF-8")
@ApiResponses({
        @ApiResponse(code = 200, response = String.class, message = ""),@ApiResponse(code = 204, response = String.class, message = "")
})
public Response isUserOfGroup(@PathVariable("group_id") String groupId,
                          @PathVariable("user_id") String userId) throws BadRequestException {
   if(groupService.isUserOfGroup(groupId, userId)) {
            return Response.create(javax.ws.rs.core.Response.Status.OK, "");
        } else {
            return Response.create(javax.ws.rs.core.Response.Status.NO_CONTENT, "");
        }
}


--------------------------------------


问题摘要:参数数据类型里面包含抽象数据结构

问题描述:

@RequestMapping(value = "/v3/regions/{region_id}", method = RequestMethod.GET, produces="application/json;charset=UTF-8")
public Map<String, Region> getRegion(@PathVariable("region_id") String regionId)

其中Region类包含字段locales是Map,没有具体类型。

public class Region {

    private String id;
    private String description;
    private String parent_region_id;
    private String type;
    private Map locales;
    private Links links;


错误日志:


解决建议:

这种情况是具体情况修改为具体类型即可,比如Map<String,String>,或者修改为Object。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。