spring-boot rest controller 使用枚举作为参数,重写反序列化实现任意值转枚举类型
目录
BaseEnum
package com.src.xxx.constant.enums;
public interface BaseEnum<ValueType> {
ValueType getValue();
}
MyEnum
package com.src.xxx.constant.enums;
import com.fasterxml.jackson.annotation.JsonValue;
import com.src.xxx.constant.enums.BaseEnum;
public enum MyEnum implements BaseEnum<Integer> {
Request(34, "请求"),
Response(59, "响应");
private final int value;
private final String describe;
private MyEnum(int value, String describe) {
this.value = value;
this.describe = describe;
}
@Override
public Integer getValue() {
return this.value;
}
@JsonValue
@Override
public String toString() {
return this.describe;
}
}
StringToEnumConverterFactory
package com.src.xxx.configuration.converter;
import com.google.common.collect.Maps;
import com.src.xxx.constant.enums.BaseEnum;
import com.sun.istack.Nullable;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
import org.springframework.util.ObjectUtils;
import java.util.Map;
@SuppressWarnings({"rawtypes", "unchecked"})
public final class StringToEnumConverterFactory implements ConverterFactory<String, BaseEnum<String>> {
private static final Map<Class, Converter> CONVERTERS = Maps.newHashMap();
/**
* Get the converter to convert from S to target type T, where T is also an instance of R.
*
* @param targetType the target type to convert to
* @return a converter from S to T
*/
@Override
public <T extends BaseEnum<String>> Converter<String, T> getConverter(Class<T> targetType) {
Converter<String, T> converter = CONVERTERS.get(targetType);
if(converter == null){
converter = new ObjectToEnumConverter(targetType);
CONVERTERS.put(targetType, converter);
}
return converter;
}
static final class ObjectToEnumConverter<E extends BaseEnum> implements Converter<String, E> {
private final Map<String, E> enumMap = Maps.newHashMap();
ObjectToEnumConverter(Class<E> enumType){
E[] enums = enumType.getEnumConstants();
for (E e : enums) {
enumMap.put(e.getValue().toString(), e);
}
}
@Override
@Nullable
public E convert(String source) {
E e = enumMap.get(source);
if(ObjectUtils.isEmpty(e)) {
return null;
}
return e;
}
}
}
FormatterConfig
package com.src.xxx.configuration;
import com.src.xxx.configuration.converter.StringToEnumConverterFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class FormatterConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverterFactory(new StringToEnumConverterFactory());
}
}
DTO
package com.src.xxx.dto.test;
import com.src.xxx.constant.enums.MyEnum;
import lombok.Data;
@Data
public class EnumQueryDTO {
private MyEnum myEnum;
}
package com.src.xxx.dto.test;
import com.src.xxx.constant.enums.MyEnum;
import lombok.Data;
@Data
public class EnumBodyDTO {
private MyEnum myEnum;
}
RestController
package com.src.xxx.controller;
import com.src.xxx.dto.test.EnumBodyDTO;
import com.src.xxx.dto.test.EnumQueryDTO;
import org.springframework.http.ResponseEntity;
@RestController
@RequestMapping("/api/test")
public class TestController {
@GetMapping("/enum")
public ResponseEntity<MyEnum> getEnum(EnumQueryDTO query) {
return ResponseEntity.ok(query.getMyEnum());
}
@PostMapping("/enum")
public ResponseEntity<MyEnum> postEnum(@RequestBody EnumBodyDTO body) {
return ResponseEntity.ok(body.getMyEnum());
}
}
参考
spring-boot rest controller 使用枚举作为参数,重写反序列化实现任意值转枚举类型的更多相关文章
- Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理
Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理 本文链接:https://blog.csdn.net/puhaiyang/article/details/78146620 ...
- Spring Boot的Controller控制层和页面
一.项目实例 1.项目结构 2.项目代码 1).ActionController.Java: package com.example.controller; import java.util.Date ...
- spring boot:使用validator做接口的参数、表单、类中多字段的参数验证(spring boot 2.3.1)
一,为什么要做参数验证? 永远不要相信我们在后端接收到的数据, 1,防止别人通过接口乱刷服务:有些不怀好意的人或机构会乱刷我们的服务,例如:短信接口, 相信大家可能很多人在工作中遇到过这种情况 2,防 ...
- spring boot利用controller来测试写的类
我们在开发spring boot应用程序的时候,往往需要测试某个写好的类,但是在测试的时候发现不太好测试,用Junit等测试框架,总是会报一些问题,大致是找不到配置文件以及无法利用spring创建的对 ...
- Spring Boot之 Controller 接收参数和返回数据总结(包括上传、下载文件)
一.接收参数(postman发送) 1.form表单 @RequestParam("name") String name 会把传递过来的Form表单中的name对应 ...
- Spring Boot学习——Controller的使用
本文主要记录几个注释的使用方法. 1. @Controller : 处理http请求 2. @RequestMapping : 配置URL映射 3. @RestController : 组合注解,sp ...
- spring boot junit controller
MockMvc 来自Spring Test,它允许您通过一组方便的builder类向 DispatcherServlet 发送HTTP请求,并对结果作出断言.请注意,@AutoConfigureMoc ...
- Spring Boot从Controller层进行单元测试
单元测试是程序员对代码的自测,一般公司都会严格要求单元测试,这是对自己代码的负责,也是对代码的敬畏. 一般单元测试都是测试Service层,下面我将演示从Controller层进行单元测试. 无参Co ...
- Spring注解之Controller中获取请求参数及验证使用
1.处理request的uri部分的参数:@PathVariable. 2.处理request header部分的参数:@RequestHeader,@CookieValue@RequestHeade ...
随机推荐
- 创建TypeScript代码模板(NVS+Yarn+ESLint+Prettier+Husky)
创建TypeScript代码模板(NVS+Yarn+ESLint+Prettier+Husky) Cui, Richard Chikun 本文笔者将带你在Github代码仓库创建TypeScript代 ...
- JavaScript HTML5脚本编程——“历史状态管理”的注意要点
历史状态管理是现代Web应用开发中的一个难点.在现代Web应用中,用户的每次操作不一定会打开一个全新的页面,因此"后退"和"前进"按钮也就失去了作用,导致用户很 ...
- Day05 - Flex 实现可伸缩的图片墙 中文指南
Day05 - Flex 实现可伸缩的图片墙 中文指南 作者:liyuechun 简介:JavaScript30 是 Wes Bos 推出的一个 30 天挑战.项目免费提供了 30 个视频教程.30 ...
- ES6-11学习笔记--解构赋值
解构赋值:按照一定模式,从数组和对象中提取值,对变量进行赋值. 数组解构 对象解构 字符串解构 应用场景 曾经的赋值噩梦,非解构赋值数组: let arr = [1, 2, 3]; let ...
- idea 提示错误: 找不到或无法加载主类
首先检查自己的jdk 配置是否正确,检查好遍发现没有问题,但是项目就是运行不起来...... 重启idea,问题解决.
- 手写封装防抖debounce
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 微信小程序页面跳转参数传递
可以使用标签直接传递 <navigator class="gotoDetail" target="self" url="../detail/de ...
- ubuntu连接不到WiFi
ubuntu连接不到WiFi 在软件与更新中,进入附加驱动. 搜到对应的无线网卡驱动,安装后在重启电脑.
- 解决一次calico异常情况,pod之间访问pod ip不通
k8s 集群采用二进制安装,cni网络插件用calico通讯问题描述:发现有些pod不是很正常例如: ht13.node正常系统采样 [root@ht6 ~]# cat /etc/redhat-rel ...
- docker方式安装zabbix
这个示例展现了如何运行支持MySQL数据库的Zabbix server,基于Nginx web服务器运行Zabbix web接口,以及Zabbix Java gateway. 1. 启动一个空的MyS ...