因此,我有一个Spring Boot应用程序,它必须接受参数为“some_value=1500”的GET请求
我试过@JsonProperty(“some_value”),但没有成功。我已经将spring.jackson.property命名策略=SNAKE_CASE添加到我的application.properties文件中,但它仍然不起作用。
重要细节:当我尝试序列化一个对象时,它确实会转换一些值=
请帮忙。谢谢
所以@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参数。
我认为您在配置中有一些错误,在我的例子中,原因是@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设置皈依是行不通的
另一种方法是创建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中,我有以下方法,它应该接受该消息,将其转换为一个对象,并将其保存在数据库中,看起来如下所示: 编辑:根据请求添加堆栈跟踪。