运行时使用请求范围的bean

时间:2017-08-03 18:22:36

标签: java json spring jackson2

我想从请求标头中驱动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时出错:Scope'request'对当前线程无效;考虑为这个bean定义一个范围代理,如果你想从一个单例引用它;嵌套异常是java.lang.IllegalStateException:找不到线程绑定请求:您是指在实际Web请求之外的请求属性,还是在最初接收线程之外处理请求?如果您实际上是在Web请求中操作并仍然收到此消息,则您的代码可能在DispatcherServlet / DispatcherPortlet之外运行:在这种情况下,请使用RequestContextListener或RequestContextFilter来公开当前请求。

然后我考虑创建另一个bean,如下所示。但是在定义了下面的bean之后,请求并没有来到上面定义的bean。

@Primary
@Bean
public Jackson2ObjectMapperBuilder pobjectMapperBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
return builder;
}

任何人都可以建议任何解决方案。提前谢谢。

0 个答案:

没有答案