当前位置: 首页 > news >正文

做家具的外国网站网站开发与维护就业前景

做家具的外国网站,网站开发与维护就业前景,基本的网站开发技术路线,网银汇款企业做网站用途写什么前言 RequestBody 注解是我们进行JavaEE开发,最常见的几个注解之一,这篇博文我们以案例和源码相结合,帮助大家更好的了解 RequestBody 注解 使用案例 1.自定义实体类 Data NoArgsConstructor AllArgsConstructor public class User {priv…

前言

@RequestBody 注解是我们进行JavaEE开发,最常见的几个注解之一,这篇博文我们以案例和源码相结合,帮助大家更好的了解 @RequestBody 注解

使用案例

1.自定义实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {private String username;private String password;@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}
}
@RestController
@RequestMapping("/request_body")
public class RequestBodyController {@PostMapping("/entity")public String entity(@RequestBody User user) {return user.toString();}}

 2.使用 Map 接收
@PostMapping("/map")
public String map(@RequestBody Map<String, User> map) {return map.toString();
}

3.自定义实体类 (复杂对象)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Complex {private String tag;private List<User> list;private User[] array;private Map<String, User> map;
}
@PostMapping("/complex")
public String complex(@RequestBody Complex complex) {return complex.toString();
}

请求参数
{"tag": "complex","list": [{"username": "anna","password": "123"},{"username": "bob","password": "456"}],"array": [{"username": "cindy","password": "135"},{"username": "david","password": "246"}],"map": {"u1": {"username": "eric","password": "159"},"u2": {"username": "frank","password": "357"}}
}
4.Content-Type 为 application/xml
添加 POM 文件
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.16.1</version>
</dependency>
接口方法 (和案例1只有方法名不一样)
@PostMapping("/xml")
public String xml(@RequestBody User user) {return user.toString();
}
请求头设置

将 Content-Type 设置为 application/xml (一般情况下 Content-Type 为 application/json

传递参数
<User><username>tom</username><password>123</password>
</User>
响应结果

源码解析

InvocableHandlerMethod#getMethodArgumentValues

参数的处理分为两个阶段:

  1. 判断当前环境中存在的resolvers,是否支持解析当前参数
  2. 处理参数
判断是否支持解析当前参数

我的环境中存在27个resolvers,通过命名我们大概可以猜测出 RequestResponseBodyMethodProcessor 是处理 @RequestBody 注解的 resolver

RequestResponseBodyMethodProcessor#supportsParameter

即如果参数上存在 @RequestBody 注解,则使用 RequestResponseBodyMethodProcessor 处理参数

RequestResponseBodyMethodProcessor#resolveArgument

RequestResponseBodyMethodProcessor 的 resolveArgument 方法会遍历当前环境中的 HttpMessageConverters,如果存在一个 HttpMessageConverter 的 canRead 方法返回 true,则使用该 HttpMessageConverter 的 read 方法读取数据。

案例1、2、3 的原理其实是一样的,request 的 Content-Type 为 application/json,spring-boot-starter-web 会引入 json 相关依赖,所以默认情况下,SpringMVC 有把 json 对象转换成 key-value 形式数据结构的能力

案例4 我们引用了相关依赖,使得 SpringMVC 有把 xml 对象转换成 key-value 形式数据结构的能力

小结

如果 request 的 Content-Type 为 xxx,并且存在一个 HttpMessageConverter 支持解析 Content-Type 为 xxx 的数据,通过 @RequestBody 注解,就可以将数据绑定到 key-value 形式的数据结构上 

扩展:自定义HttpMessageConverter,处理指定 Content-Type 的请求

创建HttpMessageConverter
public class UserTextPlainHttpMessageConverter implements HttpMessageConverter {@Overridepublic boolean canRead(Class clazz, MediaType mediaType) {return clazz == User.class && "text".equals(mediaType.getType()) && "plain".equals(mediaType.getSubtype());}@Overridepublic boolean canWrite(Class clazz, MediaType mediaType) {return false;}@Overridepublic List<MediaType> getSupportedMediaTypes() {return Collections.singletonList(MediaType.TEXT_PLAIN);}@Overridepublic Object read(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {try (InputStream inputStream = inputMessage.getBody();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {String line;StringBuilder sb = new StringBuilder();while ((line = reader.readLine()) != null) {sb.append(line);}ObjectMapper objectMapper = new ObjectMapper();return objectMapper.readValue(sb.toString(), User.class);} catch (Exception e) {throw new RuntimeException(e);}}@Overridepublic void write(Object o, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {}
}
创建配置类
@Configuration
public class MessageConfig implements WebMvcConfigurer {@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(new UserTextPlainHttpMessageConverter());}}
接口方法 (和案例1、4 只有方法名不一样)
@PostMapping("/convert")
public String convert(@RequestBody User user) {return user.toString();
}
Postman设置
 Content-Type 设置为 text/plain

body 传参类型为 text

接口响应

http://www.yayakq.cn/news/958218/

相关文章:

  • 网站设计样式行业协会网站模板
  • php网站开发手机绑定北京网站seo服务
  • 外国做营销方案的网站东莞门户网站建设报价表
  • 做付费下载的网站太原提高网站排名
  • 布吉网站的建设改图在线处理图片
  • 个人建站赚钱山东济南网络科技有限公司
  • 个人网站备案名字大全移动端app是什么意思
  • 域名连接网站有什么好的手机推荐网站
  • linux服务器做网站wordpress会员无广告
  • 北京网站维护南宁网站开发企业
  • 西宁做网站_君博优选东莞万江网站制作
  • 大淘客网站上的推广怎么做做论坛网站需要多大空间
  • 电商企业网站建设高端的丹阳网站建设
  • 网站建设用户画像例子百度收录api怎么提交
  • 甘肃营销型网站建设菏泽财富中心网站建设
  • 网站制作的流程包括哪些哪里有做效果图的网站
  • 织梦网站备案两学一做知识问答网站
  • 由一个网页建成的网站网站建设及维护流程图
  • 怎么建立自己的网站?怎么申请域名建网站
  • 建设网站服务器端环境要求西部数码网站打不开
  • jsp网站开发详细教程seo整站优化更能准确获得客户
  • 镇江教育云平台网站建设北京ui设计
  • 四川住房和城乡建设九大员网站杭州企业宣传片制作
  • 那个餐饮网站职业技能培训学校
  • 北城旺角做网站的设计一个网页大概多少钱
  • iis怎么建设网站wordpress seo插件中文版
  • 腾讯网站建设分析WordPress站点地址填错
  • 商务网站建设策划思路商城网站设计教程
  • 展示用网站模板wordpress 商店主题
  • 微信怎样将网站的内容做广西建设工程质量安全监督总站网站