【发布时间】:2016-01-23 09:59:09
【问题描述】:
我有一个 Spring REST Web 服务,它根据我们在数据库中的数据填充一个通用对象,目标是让用户将参数传递给 Web 服务以指示他们希望输出的格式. 根据他们的输入,我们将使用正确的 JSONSerializer 给他们想要的东西。
我已经如下设置了我的 web 服务,在我的 spring-ws-servlet.xml 我已经设置了我们公司的 ObjectMapper 以供 mvc:message-converters 使用,我还在 RestController 上设置它以便它可以调整 ObjectMapper 以注册序列化程序。它看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="jacksonObjectMapper" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<bean id="endpoint" class="org.company.Controller">
<property name="objectMapper" ref="jacksonObjectMapper" />
</bean>
<bean id="jacksonObjectMapper" class="org.company.CompanyObjectMapper" />
</beans>
控制器如下所示:
@RestController
public class Controller {
private ObjectMapper objectMapper;
@RequestMapping(...)
public GenericObject getObject(@PathVariables ...) {
//Get Object from database, just creating an object for example
GenericObject object = new GenericObject();
//Based on the user input we will pick out
//a Serializer that extends JsonSerializer<GenericObject>
BaseSerializer serializer = getSerializer();
//Create a simpleModule and use it to register our serializer
SimpleModule module = new SimpleModule();
module.addSerializer(GenericObject.class, serializer);
//get module and register the serializer
ObjectMapper mapper = getObjectMapper();
mapper.registerModule(module);
return object;
}
public ObjectMapper getObjectMapper() {
return objectMapper;
}
public void setObjectMapper(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
}
问题是当我发布我的 webapp 时,第一个查询可以正常工作,如果我指定 format=format1,我将得到 format1 的输出。但是,在那之后我只能收到format1。我可以指定 format=format2,但仍以 format1 获得输出。我认为问题在于 ObjectMapper 仍然从第一个查询中注册了模块。我已经读过我可以通过每次创建一个新的 ObjectMapper 来避免这个问题,但我不确定如何设置它以供 Spring 在输出 JSON 时使用。
有人可以帮我想出一个解决方案,要么在我每次运行代码时创建一个新的 ObjectMapper 并将该 ObjectMapper 设置为 Spring 休息服务,要么帮我弄清楚如何“取消注册”任何已注册的模块在设置最新的所需序列化程序之前在对象映射器上?
【问题讨论】:
-
你确定这不是缓存相关的吗?如果您通过检查接受标头来选择内容类型,
Vary: Accept可能会阻止这种情况。