IBaseEnum.java

  1. public interface IBaseEnum {
  2. public String getName();
  3. }

FuncEnum.java

  1. import com.ssslinppp.enumConvert.IBaseEnum;
  2. public enum FuncEnum implements IBaseEnum {
  3. AVG("avg", "func-avg"),
  4. MAX("max", "func-max"),
  5. MIN("min", "func-min"),
  6. SUM("sum", "func-sum"),
  7. LAST("last", "func-last");
  8. private String name;
  9. private String desc;
  10. FuncEnum(String name, String desc) {
  11. this.name = name;
  12. this.desc = desc;
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. public String getDesc() {
  21. return desc;
  22. }
  23. public void setDesc(String desc) {
  24. this.desc = desc;
  25. }
  26. }

StringToBaseEnumConverterFactory.java

  1. package com.ssslinppp.enumConvert;
  2. import org.springframework.core.convert.converter.Converter;
  3. import org.springframework.core.convert.converter.ConverterFactory;
  4. /**
  5. * Description: 将String转换为枚举类型
  6. */
  7. public class StringToBaseEnumConverterFactory implements ConverterFactory<String, IBaseEnum> {
  8. @Override
  9. public <T extends IBaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
  10. if (!targetType.isEnum()) {
  11. throw new UnsupportedOperationException("只支持转换到枚举类型");
  12. }
  13. return new StringToBaseEnumConverter(targetType);
  14. }
  15. private class StringToBaseEnumConverter<T extends IBaseEnum> implements Converter<String, T> {
  16. private final Class<T> enumType;
  17. public StringToBaseEnumConverter(Class<T> enumType) {
  18. this.enumType = enumType;
  19. }
  20. @Override
  21. public T convert(String s) {
  22. for (T t : enumType.getEnumConstants()) {
  23. if (s.equals(t.getName())) {
  24. return t;
  25. }
  26. }
  27. return null;
  28. }
  29. }
  30. }

注册自定义的ConverterFactory

MyWebAppConfigurer.java

  1. package com.ssslinppp.configs;
  2. import com.ssslinppp.enumConvert.StringToBaseEnumConverterFactory;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.format.FormatterRegistry;
  5. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
  6. /**
  7. * Description:注册自定义的ConverterFactory
  8. */
  9. @Configuration
  10. public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
  11. @Override
  12. public void addFormatters(FormatterRegistry registry) {
  13. registry.addConverterFactory(new StringToBaseEnumConverterFactory());
  14. }
  15. }

测试

EnumModel.java

  1. package com.ssslinppp.model;
  2. import com.ssslinppp.enumConvert.baseEnumImpl.FuncEnum;
  3. public class EnumModel {
  4. private FuncEnum funcEnum;
  5. public FuncEnum getFuncEnum() {
  6. return funcEnum;
  7. }
  8. public void setFuncEnum(FuncEnum funcEnum) {
  9. this.funcEnum = funcEnum;
  10. }
  11. }

同时测试@RequestBody和@RequestParam

EnumController.java 测试类

  1. package com.ssslinppp.controller;
  2. import com.ssslinppp.enumConvert.baseEnumImpl.FuncEnum;
  3. import com.ssslinppp.model.EnumModel;
  4. import org.springframework.web.bind.annotation.*;
  5. @RestController
  6. @RequestMapping("/enum")
  7. public class EnumController {
  8. @RequestMapping("/print")
  9. public String printEnums(@RequestBody EnumModel enumModel, @RequestParam("pathEnum") FuncEnum pathEnum) {
  10. System.out.println("[" + enumModel.getFuncEnum().getName() + ":" + enumModel.getFuncEnum().getDesc() + "]");
  11. System.out.println("[" + pathEnum.getName() + ":" + pathEnum.getDesc() + "]");
  12. return "[" + pathEnum.getName() + ":" + pathEnum.getDesc() + "]";
  13. }
  14. }

请求URL

  1. localhost:8080/enum/print?pathEnum=max
  2. method: post
  3. mediaType:application
  4. 请求体:
  5. {
  6. "funcEnum": "AVG"
  7. }

测试结果(output):

  1. [avg:func-avg]
  2. [max:func-max]

参考:

Demo1

Spring Boot绑定枚举类型参数

【枚举类型】Restful API请求--转换String为枚举类型的更多相关文章

  1. httpclient连接池在ES Restful API请求中的应用

    package com.wm.utils; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http ...

  2. kylin 使用RESTful API 请求

    目前根据Kylin的官方文档介绍,Kylin的认证是basic authentication,加密算法是Base64,在POST的header进行用户认证我使用的用户和密码是(格式:username: ...

  3. 使用 SpringBoot 构建一个RESTful API

    目录 背景 创建 SpringBoot 项目/模块 SpringBoot pom.xml api pom.xml 创建 RESTful API 应用 @SpringBootApplication @C ...

  4. python之restful api(flask)获取数据

    需要用到谷歌浏览器的扩展程序 Advanced Rest Client进行模拟请求 1.直接上代码 from flask import Flask from flask import request ...

  5. SpringBoot实现JWT保护前后端分离RESTful API

    通常情况下, 将api直接暴露出来是非常危险的. 每一个api呼叫, 用户都应该附上额外的信息, 以供我们认证和授权. 而JWT是一种既能满足这样需求, 而又简单安全便捷的方法. 前端login获取J ...

  6. Openstack创建虚拟机 Restful api和RPC调用

    Horizon前台界面用于接受用户的输入或动作(action),然后将这些参数构造成RESTful API(https://developer.openstack.org/api-ref/comput ...

  7. golang interface类型转string等其他类型

    inter 是interface类型,转化为string类型是: str := inter .(string) 转为其他类型也类似

  8. 03.枚举和string以及int类型之间的转换

    练习1:   将枚举类型强转成int类型 namespace _04.枚举类型的练习01 { //声明一个QQState类型的枚举 public enum QQState { OnLine, OffL ...

  9. 使用WebApiClient请求和管理Restful Api

    前言 本篇文章的内容是WebApiClient应用说明篇,如果你没有了解过WebApiClient,可以先阅读以下相关文章: WebApi client 的面向切面编程 我来给.Net设计一款Http ...

随机推荐

  1. [LeetCode&Python] Problem 860. Convert BST to Greater Tree

    Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original B ...

  2. C#并发编程之异步编程2

    C#并发编程之异步编程(二)   写在前面 前面一篇文章介绍了异步编程的基本内容,同时也简要说明了async和await的一些用法.本篇文章将对async和await这两个关键字进行深入探讨,研究其中 ...

  3. mvc core2.1 Identity.EntityFramework Core 配置 (一)

    https://docs.microsoft.com/zh-cn/aspnet/core/security/authentication/customize_identity_model?view=a ...

  4. python在图片上画矩形

    python在图片上画矩形 image_path = '' image = cv2.imread(image_path) first_point = (100, 100) last_point = ( ...

  5. 《DSP using MATLAB》Problem 5.14

    说明:这两个小题的数学证明过程都不会,欢迎博友赐教. 直接上代码: %% +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  6. 把目录C:\Python34\PCI_Code\chapter2\加到系统路径中

    >>> import sys >>> sys.path.append("C:\Python34\PCI_Code\chapter2")

  7. 【BZOJ3242】【UOJ#126】【NOI2013】快餐店

    NOI都是这种难度的题怎么玩嘛QAQ 原题: 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方. ...

  8. day 4 Socket 和 NIO Netty

    Scoket通信--------这是一个例子,可以在这个例子的基础上进行相应的拓展,核心也是在多线程任务上进行修改 package cn.itcast.bigdata.socket; import j ...

  9. 访问 iframe 内部控件方法

    方法虽然简单,但是经常忘记,网上一查,很多方法兼容性都有问题,这段代码至少兼容IE和Chrome setInterval(function(){ document.getElementById('ma ...

  10. haproxy prometheus 监控docker-compose 运行试用

    haproxy prometheus 的监控metrics 使用的是exporter ,因为haproxy 对于状态统计报告处理的 比较好,我们可以了stats 同时支持一个csv的api 接口,所以 ...