在 Spring 框架中对枚举类型的序列化/反序列化是有限制的。

假设如下面这样在某些情况下就不能正常工作:

1
2
3
4
5
6
7
8
9
public enum PayChannelEnum implements BaseEnum<Integer> {

    ALIPAY(20),

    WECHARPAY(21);

    private Integer code;

}

比如对于具有 PayChannelEnum 类型的参数的 HTTP 接口来说:

如果请求 /get?payChannel=ALIPAY,运行OK。但如果请求 /get?payChannel=20, 就会抛出 MethodArgumentTypeMismatchException 异常。

日常开发中主要有如下几种场景使用枚举:

  1. GET 方法, 参数列表中有枚举类型/自定义参数包含枚举;
  2. POST 方法 Form表单
  3. POST 方法 Json传参;

一般我们有如下步骤:

  1. 实现ConverterFactory接口
  2. 注册转换器

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class  implements ConverterFactory<String, BaseEnum> {

    private static final Map<Class,Converter> CONVERTER_MAP=new HashMap<>();

    public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> aClass) {
Converter converter=CONVERTER_MAP.get(aClass);
if(converter==null){
converter=new IntegerStrToEnumConverter<>(aClass);
CONVERTER_MAP.put(aClass, converter);
}
return converter;
} class IntegerStrToEnumConverter<T extends BaseEnum> implements Converter<String, T> { private Map<String,T> enumMap=new HashMap<>(); private IntegerStrToEnumConverter(Class<T> enumType){
T[] enums=enumType.getEnumConstants();
for (T e:enums){ enumMap.put(e.getCode()+"",e);
enumMap.put(((Enum)e).name()+"",e);
}
} 大专栏  SpringBoot 处理 POST Json 传参枚举"line"> public T convert(String source) {
T result=enumMap.get(source);
if(result==null){
//枚举字面量进行映射
throw new IllegalArgumentException("No element matches "+source);
}
return result;
}
} }

但针对Json传参,传递值时机会解析报错,可以通过设置 @JsonCreator@JsonValue来设定默认的反序列化方法. 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public enum PayChannelEnum implements BaseEnum<Integer> {

    ALIPAY(20),

    WECHARPAY(21);

    private Integer code;

    PayChannelEnum(int code) {
this.code = code;
} @JsonCreator
public static PayChannelEnum create(String name) {
try{
return PayChannelEnum.valueOf(name);
}catch (IllegalArgumentException e){
int code=Integer.parseInt(name);
for (PayChannelEnum value : PayChannelEnum.values()) {
if(value.code==code){
return value;
}
}
}
throw new IllegalArgumentException("No element matches "+name);
} public void setCode(Integer code) {
this.code = code;
} public Integer getCode() {
return code;
}
}

抽取范型,方便多种类型枚举

1
2
3
4
5
6
public interface BaseEnum<T> {

    @JsonValue
T getCode(); }

经过改造,就可以支持所有场景的枚举解析。

SpringBoot 处理 POST Json 传参枚举的更多相关文章

  1. json传参应用

    json传参应用 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于人阅 ...

  2. ASP.NET WebAPI RC 竟然不支持最常用的json传参

    壮士断腕(WCF Web API),为的是 ASP.NET Web API 的横空出世,再加上它的开放(开源),于是对之产生了一点点痴情,并写下了HttpClient + ASP.NET Web AP ...

  3. HttpClient调用doGet、doPost、JSON传参及获得返回值

    调用 doPost:map传参 Map<String,Object> map = new HashMap<>(); map.put("test"," ...

  4. json传参 js前端和java后端 的简单例子

    下面讲解了从前端js对象-->json字符串-->java字符串---->java map的过程 1,初始化js对象 var param = {}; param.krel = kre ...

  5. 关于SQL Server 2017中使用json传参时解析遇到的多层解析问题

    开发新的系统,DB部分使用了SQL Server从2016版开始自带的Json解析方式. 用了快半年,在个人项目,以及公司部分项目上使用了,暂时还没遇到大的问题,和性能问题. 今天在解析Json的多级 ...

  6. JSON传参

    通过javascript将数据组织成json格式,然后传到java后台. 注意:前台json数组传参到后台时候需要将对象(json或json数组)转换成字符串(字符串数组). Simple: 1.前台 ...

  7. json传参报错

    restful接口报错: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('e' (code 101)): w ...

  8. jquery 巧用json传参

    JavaScript代码,巧用JSON传参数function AddComment(content) { var comment = {}; comment.threadId = $("#s ...

  9. [2019/05/17]解决springboot测试List接口时JSON传参异常

    报错信息,大致如下 c.c.c.c.a.BaseControllerExceptionHandler : 运行时异常: java.lang.IllegalStateException: No prim ...

随机推荐

  1. 并发与高并发(三)-CPU多级缓存の乱序执行优化

    一.CPU多级缓存-乱序执行优化 处理器或编译器为提高运算速度而做出违背代码原有顺序的优化. 重排序遵循原则as-if-serial as-if-serial语义:不管怎么重排序(编译器和处理器为了提 ...

  2. 套接字详解(socket)

    用户认为的信息之间传输只是建立以两个应用程序上,实际上在TCP连接中是靠套接字来作为他们连接的桥梁. 那么什么是套接字呢? TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做 ...

  3. python-day1 爬虫基础之HTTP基本原理

    经过前几天的开发环境配置,今天终于正式开启学Python之路了,今天主要看了HTTP的基本原理,下边做一个总结: 1.首先要了解的就是URI和URL,URI的全拼是Uniform Resource I ...

  4. Lua与C++交互初探之C++调用Lua

    Lua与C++交互初探之C++调用Lua 自从学习了lua这个脚本语言之后,无时不想着将他与c/c++联系起来,看看他真正的威力.奈何水平有限,网上找的代码无论怎样都无法运行成功.我知道是我少了某一步 ...

  5. PHP 限制访问ip白名单

    一  上代码 config.php //ip白名单配置 'ipWlist'=>[ 'ifFilter'=>true, //是否开启白名单功能 'wlist'=>[ '10.0.0.1 ...

  6. iOS个人中心渐变动画、微信对话框、标签选择器、自定义导航栏、短信验证输入框等源码

    iOS精选源码 简单的个人中心页面-自定义导航栏并予以渐变动画 程序员取悦女票的正确姿势---Tip1(iOS美容篇) iOS 前台重启应用和清除角标的问题 微信原生提醒对话框3.0 JHLikeBu ...

  7. is,==区别,编码转换

    一.is 比较的是内存地址 == 比较的是两边的值 二.编码扩展: 1字节(bytes) = 8 位(bit) 1024byte = 1kb 1024kb = 1MB 1024MB = 1GB 102 ...

  8. 主效应|处理误差 |组间误差|处理效应|随机误差|组内误差|误差|效应分析|方差齐性检验|SSE|SSA|SST|MSE|MSA|F检验|关系系数|完全随机化设计|区组设计|析因分析

    8 什么是只考虑主效应的方差分析? 就是不考虑交互效应的方差分析,即认为因素之间是不相互影响的,就是无重复的方差分析.   什么是处理误差 (treatment error).组间误差(between ...

  9. Java基础语法要点

    1.Java中byte.short.int.long的取值范围 byte:[-128,127] short:[-32768,32767] int:[-2147483648,2147483647] lo ...

  10. 非线程安全的HashMap 和 线程安全的ConcurrentHashMap

    在平时开发中,我们经常采用HashMap来作为本地缓存的一种实现方式,将一些如系统变量等数据量比较少的参数保存在HashMap中,并将其作为单例类的一个属性.在系统运行中,使用到这些缓存数据,都可以直 ...