把前端传到后端的值用枚举标识有好处。
比如:可以罗列出来前端会传过来的值有哪些种类,可以方便的并且有效的管理该属性。
1.定义枚举
public enum FruitType {
APPLE, ORANGE;
}
2. 用在request body中
// Request Body DTO
public class RequestBodyDTO {
private FruitType type;
// getter, setter
}
@PostMapping
public String resource(@RequestBody RequestBodyDTO dto) {
dto.getType() // 这里就是枚举了
}
那么形如这样的json
{
"type": "APPLE"
}
就可以映射成java对象
3. 用在Request Parmas中
@GetMapping
public String resource(@RequestParams("type") FruitType type) {
type// 拿到的参数就是枚举了
}
TIPS
但是有些时候前端可能传过来的数据不是那么正则,比如会传过来,apple 或者 Apple, 那么枚举里没有这个枚举值就挂了。所以这时需要忽略大小写。
对于springboot2的方式是:
- 在application.yml中配置即可
spring:
jackson:
mapper:
ACCEPT_CASE_INSENSITIVE_ENUMS: true
但是配置这种只能解决通过对象传进来的情况(request body),如上例的post方式。
- 让上述get方式的request params方式也生效
@Configuration
public class FormatterConfiguration implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
ApplicationConversionService.configure(registry);
}
}
- 如果传过来的数据不在定义的枚举里会报没有匹配上枚举的错误,则可以配置
@Configuration
public class CustomSerializeJsonConfigurer implements WebMvcConfigurer {
@Autowired
private ObjectMapper objectMapper;
@PostConstruct
public void customObjectMapper() {
// 枚举没有匹配上 默认值为false
objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
}
@PostConstruct
public void myObjectMapper() {
// 如果没有匹配上,默认为某个枚举,则这时需要在要指定枚举的上面加:
// @JsonEnumDefaultValue
objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE, true);
}
网友评论