Spring boot 在Spring Boot中使用Gson配置snake_案例查询参数
我尝试将Gson配置为JSON映射器,以接受“snake_case”查询参数,并将其转换为标准Java“camelCase”参数 首先,我知道我可以使用Spring boot 在Spring Boot中使用Gson配置snake_案例查询参数,spring-boot,gson,Spring Boot,Gson,我尝试将Gson配置为JSON映射器,以接受“snake_case”查询参数,并将其转换为标准Java“camelCase”参数 首先,我知道我可以使用@SerializedName注释来定制每个字段的序列化名称,但这需要一些手工工作 在做了一些搜索之后,我相信以下方法应该有效(如果我错了,请纠正我) 使用Gson作为springboot的默认JSON映射器 spring.http.converters.preferred json mapper=gson 在创建GsonHttpMessageC
@SerializedName
注释来定制每个字段的序列化名称,但这需要一些手工工作
在做了一些搜索之后,我相信以下方法应该有效(如果我错了,请纠正我)
spring.http.converters.preferred json mapper=gson
GsonHttpMessageConverter
之前配置Gsonprivate GsonHttpMessageConverter createGsonHttpMessageConverter(){
Gson Gson=new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_,带下划线)
.create();
GsonHttpMessageConverter gsonConverter=新的GsonHttpMessageConverter();
gsonConverter.setGson(gson);
返回gsonConverter;
}
然后我创建了一个简单的控制器,如下所示:
@RequestMapping(value=“/example/gson命名策略”)
公共对象testNamingPolicy(ExampleParam数据){
返回数据。getCamelCase();
}
使用以下参数
类:
导入lombok.数据;
@资料
公共类示例参数{
私人案件;
}
但是,当我使用查询参数调用控制器时,?camel\u case=hello
,无法填充data.camelCase
(并且为空)。当我将查询参数更改为?camelCase=hello
时,可以对其进行设置,这意味着我的设置没有按预期工作
任何暗示都将不胜感激。提前谢谢 这是个好问题。如果我了解SpringMVC在幕后是如何工作的,那么
@modeldattribute
-驱动就没有使用HTTP转换器。当从ExampleParam
构造函数或ExampleParam.setCamelCase
方法(de Lombok first)抛出异常时,可以很容易地检查它——Spring使用它的bean实用程序使用public
(!)ExampleParam.setCamelCase
来设置DTO值。另一个证明是,无论Gson转换器如何配置,都不会调用noGson.fromJson
。因此,您的camelCase
让您感到困惑,因为默认的Gson实例和Spring一样使用这种策略——所以这只是一个困惑的问题
为了使其工作,您必须创建一个自定义的Gson感知HandlerMethodArgumentResolver
实现。假设我们只支持POJO(不支持列表、映射或原语)
@配置
@EnableWebMvc
类WebMVC配置
扩展WebMVCConfigureAdapter{
私有静态最终Gson Gson=new GsonBuilder()
.setFieldNamingPolicy(小写字母,带下划线)
.create();
@凌驾
公共无效AddArgumentResolver(最终列表ArgumentResolver){
add(新HandlerMethodArgumentResolver(){
@凌驾
公共布尔支持参数(最终方法参数){
//它决不能是基元、数组、字符串、装箱编号、映射或列表,以及您配置的任何内容;)
最后一个类parameterType=parameter.getParameterType();
return!parameterType.isPrimitive()
&&!parameterType.isArray()
&¶meterType!=String.class
&&!Number.class.isAssignableFrom(参数类型)
&&!Map.class.isAssignableFrom(参数类型)
&&!List.class.isAssignableFrom(parameterType);
}
@凌驾
公共对象resolveArgument(final MethodParameter参数、final ModelAndViewContainer mavContainer、final NativeWebRequest webRequest、,
最终WebDataBinder工厂(binderFactory){
//现在我们正在解构请求参数,创建一个JSON树,因为Gson可以透明地从JSON树转换为POJO
//还要注意parameter.getGenericParameterType()--最好是不能保存泛型类型参数化的类
返回gson.fromJson(
ParameterMapToJSoneElement(webRequest.getParameterMap()),
parameter.getGenericParameterType()
);
}
});
}
...
私有静态JsonElement参数MapToJSONElement(最终映射参数){
final JsonObject JsonObject=new JsonObject();
对于(最终条目e:parameters.entrySet()){
最后一个字符串key=e.getKey();
最终字符串[]值=e.getValue();
最终JsonElement jsonValue;
开关(value.length){
案例0:
//据我所知,这绝对不会发生,但我不确定
jsonValue=JsonNull.INSTANCE;
打破
案例1:
//如果只有一个值,让我们将其转换为字符串文字
//Gson擅长“弱类型”:字符串可以自动解析为数字和布尔值
jsonValue=新的JsonPrimitive(值[0]);
打破
违约:
//如果有多个元素--将其设为数组
最终JsonArray JsonArray=新JsonArray();
for(int i=0;i
因此,以下是结果: