【摘要】 本文是使用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。

来源:华为云社区  作者:liubao68

Spring MVC DispatcherServlet改造为 CSE RestServlet 常见问题汇编相关推荐

  1. spring mvc DispatcherServlet解读

    spring mvc DispatcherServlet解读 DispatcherServlet的继承和实现 IDEA按快捷键:ctrl+alt+u,就可以查看DispatcherServlet的继承 ...

  2. spring mvc DispatcherServlet详解之三---request通过ModelAndView中获取View实例的过程

    整个spring mvc的架构如下图所示: 上篇文件讲解了DispatcherServlet第二步:通过request从Controller获取ModelAndView.现在来讲解第三步:reques ...

  3. spring mvc DispatcherServlet详解之前传---FrameworkServlet

    做项目时碰到Controller不能使用aop进行拦截,从网上搜索得知:使用spring mvc 启动了两个context:applicationContext 和WebapplicationCont ...

  4. spring mvc DispatcherServlet详解之二---request通过Controller获取ModelAndView过程

    整个spring mvc的架构如下图所示: 上篇文件讲解了DispatcherServlet通过request获取控制器Controller的过程,现在来讲解DispatcherServletDisp ...

  5. spring mvc DispatcherServlet详解之一--request通过HandlerMaping获取控制器Controller过程

    整个spring mvc的架构如下图所示: 现在来讲解DispatcherServletDispatcherServlet的第一步:获取控制器. HandlerMapping HandlerMappi ...

  6. spring mvc DispatcherServlet详解之四---视图渲染过程

    整个spring mvc的架构如下图所示: 现在来讲解DispatcherServletDispatcherServlet的最后一步:视图渲染.视图渲染的过程是在获取到ModelAndView后的过程 ...

  7. spring mvc DispatcherServlet详解之interceptor和filter的区别

    首先我们看一下spring mvc Interceptor的功能及实现: http://wenku.baidu.com/link?url=Mw3GaUhCRMhUFjU8iIDhObQpDcbmmRy ...

  8. spring mvc DispatcherServlet详解之一---处理请求深入解析

    要深入理解spring mvc的工作流程,就需要先了解spring mvc的架构: 从上图可以看到 前端控制器DispatcherServlet在其中起着主导作用,理解了DispatcherServl ...

  9. spring mvc DispatcherServlet详解之前传---前端控制器架构

    前端控制器是整个MVC框架中最为核心的一块,它主要用来拦截符合要求的外部请求,并把请求分发到不同的控制器去处理,根据控制器处理后的结果,生成相应的响应发送到客户端.前端控制器既可以使用Filter实现 ...

最新文章

  1. 输入任意个整数以回车键结束_Enter键只知道回车作用?以下7个用法,你会几个?...
  2. 【深度学习】基于Pytorch的softmax回归问题辨析和应用(二)
  3. spring boot + spring batch 读数据库文件写入文本文件读文本文件写入数据库
  4. Java中空值处理的感受
  5. anychart java实例_在.Net开发中使用AnyChart的简单例子(上)
  6. (Docker实战) 第三篇:配置_开发环境
  7. Failed to find any matching files for /tmp/resnet_v1_50.ckpt
  8. 途牛windows转linux,在 Windows 中通过 VirtualBox 启动物理硬盘上的 Linux 操作系统...
  9. Altium AD20更改原理图栅格改为点栅格
  10. Unity 引擎 14 年!开发者除了游戏还可以用它来做什么?
  11. Jenkins 文档特别兴趣小组
  12. ab压力测试post请求入参json格式处理
  13. 《大数据之路:阿里巴巴大数据实践》-第2篇 数据模型篇 -第9章 阿里巴巴数据整合及管理体系
  14. java罗马数字_整数转罗马数字以及罗马数字转整数(java实现)
  15. 让你嘿嘿嘿!最新windows7升级win10方法!
  16. Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息
  17. Java面向对象编程——继承
  18. 一款语文老师写的word办公神级插件
  19. 科学计数法计算机怎么输,如何打印在Lua一个庞大的数字,而无需使用科学记数法?...
  20. CREO草绘标注字体设置

热门文章

  1. oracle dcd设置,Oracle配置DCD避免会话被防火墙强制断开
  2. 手机屏幕坏了如何把手机里面的资料取出来_手机碎屏原来也有这么多讲究,早了解这几个方法就不会被坑了...
  3. mysql中文乱码解决_Stata 中文乱码顽疾解决方法
  4. access汇总_区块链或密码学相关论文汇总,持续更新中
  5. 33、JSONP跨域
  6. 斐波那契数列(大数)
  7. Python图像处理库:Pillow 初级教程
  8. petshop学习笔记(4)
  9. 柯达新款Wi-Fi数码相机闪亮登场
  10. cesium 3dtiles 加载本地数据_深入echarts学习:加载跨域、异步、本地json数据的防坑录