Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 在Spring Boot中使用Gson配置snake_案例查询参数_Spring Boot_Gson - Fatal编程技术网

Spring boot 在Spring Boot中使用Gson配置snake_案例查询参数

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

我尝试将Gson配置为JSON映射器,以接受“snake_case”查询参数,并将其转换为标准Java“camelCase”参数

首先,我知道我可以使用
@SerializedName
注释来定制每个字段的序列化名称,但这需要一些手工工作

在做了一些搜索之后,我相信以下方法应该有效(如果我错了,请纠正我)

  • 使用Gson作为springboot的默认JSON映射器
  • spring.http.converters.preferred json mapper=gson

  • 在创建
    GsonHttpMessageConverter
    之前配置Gson

  • 在步骤2中根据

  • private 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转换器如何配置,都不会调用no
    Gson.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
    因此,以下是结果: