我想从请求标头驱动 JSON 命名策略。根据请求标头中的值,我想设置这个策略,同样应该对 JSON 序列化和反序列化有效。
例如..
- If header is "Snake" , request will be {"first_name":"james"}
- If header is "Camel" , request will be {"firstName":"james"}
同样,响应将针对给定的命名策略进行序列化。
我想要像请求范围 bean 这样的东西,我可以在其中处理这个策略。
@Bean
@Scope(value = WebApplicationContext.SCOPE_REQUEST )
public Jackson2ObjectMapperBuilder objectMapperBuilder(
Jackson2ObjectMapperBuilder builder , @Autowired HttpServletRequest request) {
if (null == request || null == builder) {
return builder;
}
if ("Snake".equals(request.getHeader("Json_naming_strategy"))) {
builder.propertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
} else {
builder.propertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
}
return builder;
}
但是有了上面的定义,我得到了这个错误
bean初始化失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“_halObjectMapper”的 bean 时出错:bean 初始化失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名称为“objectMapperBuilder”的 bean 时出错:范围“请求”对于当前线程无效;如果您打算从单例中引用它,请考虑为该 bean 定义一个作用域代理;嵌套异常是 java.lang.IllegalStateException:未找到线程绑定请求:您是指实际 Web 请求之外的请求属性,还是在原始接收线程之外处理请求?如果您实际上是在 Web 请求中操作并且仍然收到此消息,
然后我想创建另一个bean,如下所示。但是在定义了下面的bean之后,请求没有到达上面定义的bean。
@Primary
@Bean
public Jackson2ObjectMapperBuilder pobjectMapperBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
return builder;
}
任何人都可以提出任何解决方案。提前致谢。