目录

  1. BaseEnum
  2. MyEnum
  3. StringToEnumConverterFactory
  4. FormatterConfig
  5. DTO
  6. RestController
  7. 参考

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());
}
}

参考

  1. Spring Boot 使用枚举类型作为请求参数
  2. Spring Framework/StringToEnumConverterFactory

spring-boot rest controller 使用枚举作为参数,重写反序列化实现任意值转枚举类型的更多相关文章

  1. Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理

    Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理   本文链接:https://blog.csdn.net/puhaiyang/article/details/78146620 ...

  2. Spring Boot的Controller控制层和页面

    一.项目实例 1.项目结构 2.项目代码 1).ActionController.Java: package com.example.controller; import java.util.Date ...

  3. spring boot:使用validator做接口的参数、表单、类中多字段的参数验证(spring boot 2.3.1)

    一,为什么要做参数验证? 永远不要相信我们在后端接收到的数据, 1,防止别人通过接口乱刷服务:有些不怀好意的人或机构会乱刷我们的服务,例如:短信接口, 相信大家可能很多人在工作中遇到过这种情况 2,防 ...

  4. spring boot利用controller来测试写的类

    我们在开发spring boot应用程序的时候,往往需要测试某个写好的类,但是在测试的时候发现不太好测试,用Junit等测试框架,总是会报一些问题,大致是找不到配置文件以及无法利用spring创建的对 ...

  5. Spring Boot之 Controller 接收参数和返回数据总结(包括上传、下载文件)

            一.接收参数(postman发送) 1.form表单 @RequestParam("name") String name 会把传递过来的Form表单中的name对应 ...

  6. Spring Boot学习——Controller的使用

    本文主要记录几个注释的使用方法. 1. @Controller : 处理http请求 2. @RequestMapping : 配置URL映射 3. @RestController : 组合注解,sp ...

  7. spring boot junit controller

    MockMvc 来自Spring Test,它允许您通过一组方便的builder类向 DispatcherServlet 发送HTTP请求,并对结果作出断言.请注意,@AutoConfigureMoc ...

  8. Spring Boot从Controller层进行单元测试

    单元测试是程序员对代码的自测,一般公司都会严格要求单元测试,这是对自己代码的负责,也是对代码的敬畏. 一般单元测试都是测试Service层,下面我将演示从Controller层进行单元测试. 无参Co ...

  9. Spring注解之Controller中获取请求参数及验证使用

    1.处理request的uri部分的参数:@PathVariable. 2.处理request header部分的参数:@RequestHeader,@CookieValue@RequestHeade ...

随机推荐

  1. springboot+shiro 01 - 实现权限控制

    sb_shiro_session <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...

  2. Netty学习摘记 —— 再谈引导

    本文参考 本篇文章是对<Netty In Action>一书第八章"引导"的学习摘记,主要内容为引导客户端和服务端.从channel内引导客户端.添加ChannelHa ...

  3. Netty学习摘记 —— 初步认识Netty核心组件

    本文参考 我在博客内关于"Netty学习摘记"的系列文章主要是对<Netty in action>一书的学习摘记,文章中的代码也大多来自此书的github仓库,加上了一 ...

  4. Linux中一切皆文件

    谈一谈Linux中一切皆文件 1. Linux中所有内容都是以文件的形式保存和管理,即:一切皆文件. 普通文件是文件. 目录(在win下称为文件夹)是文件. 硬件设备(键盘.硬盘.打印机)是文件. 套 ...

  5. PokemonGo:LBS游戏开发

    写在前面 去吧!皮卡丘!小时候拥有一台任天堂是多少熊孩子的梦想,每个夜晚被窝里透出的微弱光线,把小小的童年带入另一个世界,家门口的鸟和狗,森林里的虫和瀑布,山洞里的超音蝠,带着小小的梦,走过一个个城市 ...

  6. 我试试这个昵称好使不队项目NABCD指路

    我试试这个昵称好使不队项目NABCD指路:https://www.cnblogs.com/team-development/p/14617203.html

  7. 【uniapp 开发】文字缩略css

    文字超出两行后显示省略号 display: -webkit-box; overflow: hidden; text-overflow: ellipsis; word-wrap: break-word; ...

  8. java中什么叫覆盖Override?请给实例

    5.覆盖(Override) 马克-to-win:方法的覆盖(Override)是指子类重写从父类继承来的一个同名方法(参数.返回值也同). 例1.5.1-- class AAAMark_to_win ...

  9. 微信支付之微信H5支付(坑,ajax不支持重定向跳转)

    这里讲的是  微信h5支付,    是微信以外的手机浏览器调用微信h5支付  h5支付: H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起 ...

  10. js验证邮箱格式

    function test() { var temp = document.getElementById("text1"); //对电子邮件的验证 var myreg = /^([ ...