在 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. python-day6爬虫基础之会话、Cookies、代理

    由于前几天看电脑时间过长,在昨天的时候,两个眼睛就有点疼痛感觉,所以昨天晚上就没有学习,博客也没有跟着写,今早去校医院买了点药,上午把老师要求的电路板画完了,已经发出去做了,现在闲来无事,看了一会关于 ...

  2. 常用的模型集成方法介绍:bagging、boosting 、stacking

    本文介绍了集成学习的各种概念,并给出了一些必要的关键信息,以便读者能很好地理解和使用相关方法,并且能够在有需要的时候设计出合适的解决方案. 本文将讨论一些众所周知的概念,如自助法.自助聚合(baggi ...

  3. 数据处理——One-Hot Encoding

    一.One-Hot Encoding     One-Hot编码,又称为一位有效编码,主要是采用位状态寄存器来对个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效.     在实 ...

  4. tf.boolean_mask

    tf.boolean_mask 的作用是 通过布尔值 过滤元素 def boolean_mask(tensor, mask, name="boolean_mask", axis=N ...

  5. 34)static 静态成员和静态成员函数

    1) static修饰的方法,只能在这个文件中使用,比如你是多文件编程,别的文件即使引入了我的 .h文件  但那时我的static方法也是不能用 2)C++的static的成员变量   比如  sta ...

  6. 学习LCA( 最近公共祖先·二)

    http://poj.org/problem?id=1986 离线找u,v之间的最小距离(理解推荐) #include<iostream> #include<cstring> ...

  7. Clairaut 定理 证明

    (Clairaut 定理)设 $E$ 是 $\mathbf{R}^n$ 的开子集合,并设 $f:\mathbf{E}\to \mathbf{R}^{m}$ 是 $E$ 上的二次连续可微函数.那么对于一 ...

  8. eclipse配置svn若干点

    eclipse 或者针对java的,或者eclipse for php ,都行. 可以直接在线安装svn插件,也可以下载好插件后自己配置. ------------ 一下转载自http://blog. ...

  9. Web Service概述 及 应用案例

    Web Service的定义  W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用 ...

  10. java后端导出excel

    最近工作中需要导出excel.这次机智一点做个笔记,顺便写了一个比较通用的工具类.自然目前不能生成java实体类属性嵌套多次的这种没办法导出了,后续有需要的时候我再改改. 首先,java后端导出exc ...