IBaseEnum.java
public interface IBaseEnum {
public String getName();
}
FuncEnum.java
import com.ssslinppp.enumConvert.IBaseEnum;
public enum FuncEnum implements IBaseEnum {
AVG("avg", "func-avg"),
MAX("max", "func-max"),
MIN("min", "func-min"),
SUM("sum", "func-sum"),
LAST("last", "func-last");
private String name;
private String desc;
FuncEnum(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
StringToBaseEnumConverterFactory.java
package com.ssslinppp.enumConvert;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
public class StringToBaseEnumConverterFactory implements ConverterFactory {
@Override
public Converter getConverter(Class targetType) {
if (!targetType.isEnum()) {
throw new UnsupportedOperationException("隻支援轉換到枚舉類型");
}
return new StringToBaseEnumConverter(targetType);
}
private class StringToBaseEnumConverter implements Converter {
private final Class enumType;
public StringToBaseEnumConverter(Class enumType) {
this.enumType = enumType;
}
@Override
public T convert(String s) {
for (T t : enumType.getEnumConstants()) {
if (s.equals(t.getName())) {
return t;
}
}
return null;
}
}
}
注冊自定義的ConverterFactory
MyWebAppConfigurer.java
package com.ssslinppp.configs;
import com.ssslinppp.enumConvert.StringToBaseEnumConverterFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverterFactory(new StringToBaseEnumConverterFactory());
}
}
測試
EnumModel.java
package com.ssslinppp.model;
import com.ssslinppp.enumConvert.baseEnumImpl.FuncEnum;
public class EnumModel {
private FuncEnum funcEnum;
public FuncEnum getFuncEnum() {
return funcEnum;
}
public void setFuncEnum(FuncEnum funcEnum) {
this.funcEnum = funcEnum;
}
}
同時測試@RequestBody和@RequestParam
EnumController.java 測試類
package com.ssslinppp.controller;
import com.ssslinppp.enumConvert.baseEnumImpl.FuncEnum;
import com.ssslinppp.model.EnumModel;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/enum")
public class EnumController {
@RequestMapping("/print")
public String printEnums(@RequestBody EnumModel enumModel, @RequestParam("pathEnum") FuncEnum pathEnum) {
System.out.println("[" + enumModel.getFuncEnum().getName() + ":" + enumModel.getFuncEnum().getDesc() + "]");
System.out.println("[" + pathEnum.getName() + ":" + pathEnum.getDesc() + "]");
return "[" + pathEnum.getName() + ":" + pathEnum.getDesc() + "]";
}
}
請求URL
localhost:8080/enum/print?pathEnum=max
method: post
mediaType:application
請求體:
{
"funcEnum": "AVG"
}
測試結果(output):
[avg:func-avg]
[max:func-max]