设为首页 加入收藏

TOP

day08-自定义转换器&处理JSON&内容协商(一)
2023-07-25 21:36:56 】 浏览:57
Tags:day08- 处理 JSON& 容协商

自定义转换器&处理JSON&内容协商

1.自定义转换器

1.1基本介绍

  1. SpringBoot 在响应客户端请求时,将提交的数据封装成对象时,使用了内置的转换器,也就是自动帮我们封装对象。springboot 自带了124个转换器,可以实现大部分的类型间的转换。
  2. SpringBoot 也支持自定义转换器。但当前台发送请求传递的参数使用内置的转换器不能转换时,这时就需要写一个自定义的数据类型转换器,我们只需要实现 Converter 接口的 convert 方法即可

1.2应用案例

演示自定义转换器的使用。

(1)save.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>save</title>
</head>
<body>
<form action="/saveMonster" method="post">
    编号:<input name="id" value="10001"/><br/>
    姓名:<input name="name" value="齐天大圣"/><br/>
    年龄:<input name="age" value="888"/><br/>
    婚否:<input name="isMarried" value="false"/><br/>
    生日:<input name="birth" value="1456/12/12"/><br/> 
    <!--使用自定义转换器关联car,value字符串整体添加,使用逗号间隔-->
    坐骑:<input name="car" value="避水金晶兽,666.6"/><br/>
    <input type="submit" value="保存"/>
</form>
</body>
</html>

(2)自定义转换器(String-->Car)

package com.li.config;

import com.li.bean.Car;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.FormatterRegistry;
import org.springframework.util.ObjectUtils;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author 李
 * @version 1.0
 * (proxyBeanMethods = false)
 * 1.表示启用Lite模式,保证修饰的配置类中,每个@Bean方法被调用多少次返回的组件都是新创建的,
 *	是多例对象,是非代理方式。
 * 2.proxyBeanMethods 在调用 @Bean 方法时才生效,因此需要先获取BeanConfig 组件,再调用方法
 */
@Configuration(proxyBeanMethods = false)//设置为设置类
public class WebConfig {
    //注入bean-WebMvcConfigurer
    @Bean
    public WebMvcConfigurer webMvcConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addFormatters(FormatterRegistry registry) {
                /**
                 * 1.在 addFormatters()方法中添加一个自定义的转换器
                 * 2.自定义转换器要完成的功能是 String -> Car
                 * 3.增加的转换器会注册到 converters 容器中
                 * 4.converters 底层结构是 ConcurrentHashMap,默认内置了124个转换器
                 */
                registry.addConverter(new Converter<String, Car>() {
                    //<sourceType,targetType>
                    //匿名内部类
                    @Override
                    public Car convert(String source) {//source即传入的字符串
                        //加入转换的业务代码
                        if (!ObjectUtils.isEmpty(source)) {
                            Car car = new Car();
                            String[] strings = source.split(",");
                            car.setName(strings[0]);
                            car.setPrice(Double.parseDouble(strings[1]));
                            return car;
                        }
                        return null;
                    }
                });
                //还可以增加更多的转换器
            }
        };
    }
}

(3)控制器

Monster和Car是级联对象,Car为Monster对象的属性。

//处理添加Monster的方法
@PostMapping("/saveMonster")
@ResponseBody
public String saveMonster(Monster monster) {
    System.out.println("monster=" + monster);
    return "success";
}

(4)浏览器提交表单,后台输出如下:

monster=Monster(id=10001, name=齐天大圣, age=888, isMarried=false, birth=Sun Dec 12 00:00:00 CST 1456, car=Car(name=避水金晶兽, price=666.6))

可以看到服务器成功获取到表单数据,并将car表单项的value值转换为Car对象的属性值。

1.3注意事项

不同转换器通过key值区分,key=[源类型->目标类型]

image-20230320153402976

如果实现的两个自定义转换器的 key 值相同(即源类型和目标类型相同),则在注入容器时,根据注入的顺序,后一个转换器会覆盖前一个转换器!

2.处理JSON

SpringBoot 支持返回 JSON 格式的数据,在启用 WEB 开发场景时,已经引入了相关

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Nginx rewrite 详解 下一篇剑指 Offer 07. 重建二叉树(java..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目