当前位置: 首页 > 知识库问答 >
问题:

Spring Boot反序列化蛇案例到驼峰案例失败。无法将“某些值”反序列化为“某些值”

淳于博文
2023-03-14

因此,我有一个Spring Boot应用程序,它必须接受参数为“some_value=1500”的GET请求

我试过@JsonProperty(“some_value”),但没有成功。我已经将spring.jackson.property命名策略=SNAKE_CASE添加到我的application.properties文件中,但它仍然不起作用。

重要细节:当我尝试序列化一个对象时,它确实会转换一些值=

请帮忙。谢谢

共有3个答案

陶弘业
2023-03-14

所以@Barath是对的,你不能从GET参数中获得干净的反序列化对象。但是有一个变通办法。不知道这是否合法...但是事情是这样的:

@Autowired private ObjectMapper objectMapper;

@GetMapping("/users")
    public User users(@RequestParam Map<String,String> params){
        User u = objectMapper.convertValue(params,User.class);
        return u;
    }

这样,您仍然可以使用GET方法,并将所有参数反序列化为一个漂亮的小对象,以便执行任何操作。希望这对任何人都有帮助。我希望Spring/Jackson的人能够像处理POST方法一样自动反序列化GET参数。

戴浩初
2023-03-14

我认为您在配置中有一些错误,在我的例子中,原因是@EnableWebMvc注释,如果您使用此注释,spring boot的默认自动配置将不起作用。

为了将属性从camelCase转换为snake_case,您只需要覆盖beanjackson2ObjectMapperBuilder,spring使用此bean更改jackson的snake_case设置,请尝试下面的代码将它们添加到ur@Configuration文件中

@Bean
    @Primary
    public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
        Jackson2ObjectMapperBuilder jsonBuilderConfig = new Jackson2ObjectMapperBuilder();
        jsonBuilderConfig.propertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
        return jsonBuilderConfig;
    }

如果你读了AbstractJackson2HttpMessageConzer类下的方法,你可以看到jackson是如何工作的,有一个对象映射器用于转换json.track对象映射器,如果属性命名策略没有snake_case设置皈依是行不通的

赵刚豪
2023-03-14

另一种方法是创建HandlerMethodArgumentResolver。这是冗长的,但您可以处理查询字符串,插入ObjectMapper(保持相同的配置)并自行进行转换。

我创建了一个注释来过滤我想要处理的类型:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface QueryStringArgResolver {
}

然后创建了解析器:

@Component
public class QueryStringArgumentResolver implements HandlerMethodArgumentResolver {

...

    @Autowired
    private ObjectMapper mapper;

    @Override
    public boolean supportsParameter(final MethodParameter methodParameter) {
        return methodParameter.getParameterAnnotation(QueryStringArgResolver.class) != null;
    }

    @Override
    public Object resolveArgument(final MethodParameter methodParameter,
                                  final ModelAndViewContainer modelAndViewContainer,
                                  final NativeWebRequest nativeWebRequest,
                                  final WebDataBinderFactory webDataBinderFactory) throws Exception {

        final HttpServletRequest request = (HttpServletRequest) nativeWebRequest.getNativeRequest();
        final String json = qs2json(request.getQueryString());
        final Object a = mapper.readValue(json, methodParameter.getParameterType());

        return a;
    }

...
}

使用方法:

@ResponseStatus(HttpStatus.OK)
    @GetMapping("/some-url")
    public SomeResponse doSomething(@QueryStringArgResolver final SomeQueryStringToBind request) {
        ...
    }

顺便说一句,不要忘记以这种方式注册您的解析器,以便能够注入bean:

@Configuration
public class ArgumentResolverConfig implements WebMvcConfigurer {
    @Autowired
    private QueryStringArgumentResolver argumentResolver;

    @Override
    public void addArgumentResolvers(
            final List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(argumentResolver);
    }
}
 类似资料:
  • 问题内容: 我正在反序列化使用的对象,该对象包含Guid类型的私有字段和该字段的公共属性。当我的json中的my的值为null时,我想分配给我的字段。 但是想要访问私有字段,导致在尝试反序列化时出现此错误: 将值{null}转换为类型’System.Guid’时出错。路径“ [0]。属性”,第6行,位置26。 如何使其忽略私有字段,而使用公共属性? 问题答案: Json.NET拒绝为a 设置值,因

  • 因此,我有一个Spring Boot应用程序,它必须将参数为“some_value=1500&some_other_value=50000”的GET请求带给一个属性为someValue和someOtherValue的对象。 重要的细节:当我尝试序列化对象时,它会将someValue=>some_value和someOtherValue=>some_other_value转换。所以我知道配置是“好的

  • 我正在使用下面的JSON由我的springboot代码解析: 但在对其进行解析/反序列化时,我在Student的对象中得到了以下信息: RESTController: 学生豆类: 命名Bean类:

  • Json.net有没有办法只指定你想要序列化的属性?或者根据绑定标志序列化某些属性,比如只声明? 现在我正在使用< code > JObject。FromObject(MainObj。SubObj);要获取SubObj的所有属性,SubObj是遵循ISubObject接口的类的实例: 如果是,它将序列化A和B,但如果是,它将仅序列化B和C并忽略父属性

  • 问题内容: 我试图序列化和反序列化内部对象的数组列表: HairList对象也是一个可序列化的对象。 此代码执行返回以下错误: 排队 我不知道我在做什么错。你能给个小费吗? 更新: 解决: 仅使用HairBirt的本机数组而不是ArrayList即可工作: 代替 感谢大家的帮助。 问题答案: 不要使用-而是使用二进制数据并对它进行base64编码,以将其转换为字符串而不会丢失信息。 我强烈怀疑这是

  • 我有一个通过RabbitMQ作为消息发送的类,在sender服务上,它的定义如下: 并且在接收方服务上: 在receiver controller中,我有以下方法,它应该接受该消息,将其转换为一个对象,并将其保存在数据库中,看起来如下所示: 编辑:根据请求添加堆栈跟踪。