java - 如何处理枚举中空值的 InvalidFormatException
问题描述
如何处理枚举中空值的 InvalidFormatException。当一个空值被传递给底层的杰克逊解析器而不是一个低级错误时,我们想抛出一个验证错误。我们怎样才能避免这种情况?
Exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `com.company.model.Flower` from String "": not one of the values accepted for Enum class: [Lilly, Jasmine]
at [Source: (PushbackInputStream); line: 1, column: 64]
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:389)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:342)
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:186)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:158)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:131)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:920)
解决方案
假设您有版本 >= 2.12.0的jackson-databind
,
通过参考这篇文章 - Jackson 2.12 Most Wanted (4/5): CoercionConfig system
您可以添加一个配置bean来添加enum的强制设置ObjectMapper
,这样空字符串将被映射为null,然后@NotNull
在相应的enum属性上添加注释应该可以解决问题。
import com.fasterxml.jackson.databind.cfg.CoercionAction;
import com.fasterxml.jackson.databind.cfg.CoercionInputShape;
import com.fasterxml.jackson.databind.type.LogicalType;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ObjectMapperConfig {
@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
return builder -> builder.postConfigurer(objectMapper -> {
objectMapper.coercionConfigFor(LogicalType.Enum)
.setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsNull);
});
}
}
推荐阅读
- php - 如何在 Doctrine 中的父实体之间移动子实体?
- postgresql - RDBMS 事件存储:确保排序(单线程编写器)
- python - 根据未知索引在子列表中切片列表
- ios - iOS/Swift/Firebase 身份验证:访问“isNewUser”需要帮助
- javascript - 如何使二维数组的每个元素成为python中的对象?
- java - Java 聊天 - 更新 Java FX 中不同列表视图的消息
- json - 如何将这个 JSON 文件读入 Swift?
- python - 如何在 python 中编码掉 html 和特殊字符?
- r - R 软件版本 3.5.1 上的 Rgdal 包问题
- css - 我的 CSS 不会改变我的 HTML 知道为什么吗?