在 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. 工作小结:Base64注意事项、标签for属性

    Base64 场景1:后台保存的客户填写备注信息,前台无法正常展示 原因:无法正常展示的备注信息为客户直接从黑屏复制过来的信息,信息中包含有不可见的控制字符,回传至前台的json数据,浏览器无法正常解 ...

  2. java.lang.AbstractMethodError: org.slf4j.impl.JDK14LoggerAdapter.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V

    java.lang.AbstractMethodError: org.slf4j.impl.JDK14LoggerAdapter.log(Lorg/slf4j/Marker;Ljava/lang/St ...

  3. del|append()|insert()|pop()|remove()|sort()|sorted|reverse()|len()|range()|min()|max()|sum()|[:]|区分两种列表复制|

    fruit = ['apple','banana','peach'] print fruit[0],fruit[-1] fruit_1 =[] fruit_1.append('orange') pri ...

  4. 892B. Wrath#愤怒的连环杀人事件(cin/cout的加速)

    题目出处:http://codeforces.com/problemset/problem/892/B 题目大意:一队人同时举刀捅死前面一些人后还活着几个 #include<iostream&g ...

  5. 【Java杂货铺】用Security做权限极简入门

    原来大多数单体项目都是用的shiro,随着分布式的逐渐普及以及与Spring的天生自然的结合.Spring Security安全框架越受大家的青睐.本文会教你用SpringSecurity设计单项目的 ...

  6. js window.onload 加载多个函数和追加函数

    平时做项目 经常需要使用window.onload, 用法如下: function func(){alert("this is window onload event!");ret ...

  7. iOS UIWebView 允许所有三方cookie

    前几天项目中用到UIWebView, 而在网页中,用到了多说评论的第三方.但是当我在手机端发表评论的时候,出现禁用第三方cookie,而安卓是没有这种情况的,于是就在找原因.找了很久也没有找到原因.一 ...

  8. 22)PHP,数组排序函数

    详情见:   手册:函数参考-->变量和类型相关扩展-->数组--->对数组进行排序

  9. Redhat6更改yum源 (转)

    最近虚拟机中安装了redhat6.3企业版,自带的yum用不起来,软件都找不到. 网上搜了一下说是没付钱...,需要改下yum源.操作步骤如下: 1.切换到yum源存放目录[root@rhel6 ~] ...

  10. Spring Boot: Jdbc javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify

    jdbc:mysql://127.0.0.1:3306/xxx?useSSL=false 在后面添加?useSSL=false即可 参考网站