JSON使用Spring MVC 3.2延迟结果错误地返回

时间:2013-02-01 12:30:07

标签: spring rest spring-mvc asynchronous

我正在尝试将Spring MVC 3.2异步延迟结果用于RESTful JSON服务。

使用同步方法:

@ResponseBody
@RequestMapping(value = "/catalog", method = RequestMethod.GET, produces = "application/json")
public Entry catalog() {
  Entry entry = new Entry();
  entry.timestamp = System.currentTimeMillis();
  entry.summary = "Hello World!";
  entry.body = new HashMap<String, Object>();
  entry.body.put("key1", "value1");
  entry.body.put("key2", "value2");
  entry.body.put("key3", "value3");
  return entry;
}

我得到以下JSON结果:

{"timestamp":1359721240340,"summary":"Hello World!","body":{"key3":"value3","key2":"value2","key1":"value1"}}

使用异步方法(人为的例子):

@ResponseBody
@RequestMapping(value = "/catalogs", method = RequestMethod.GET, produces = "application/json")
public DeferredResult<Entry> catalogs() {
    Entry entry = new Entry();
    entry.timestamp = System.currentTimeMillis();
    entry.summary = "Hello World!";
    entry.body = new HashMap<String, Object>();
    entry.body.put("key1", "value1");
    entry.body.put("key2", "value2");
    entry.body.put("key3", "value3");
    DeferredResult<Entry> result = new DeferredResult<Entry>();
    result.setResult(entry);
    return result;
}

我得到以下内容:

{}{"timestamp":1359721240340,"summary":"Hello World!","body":{"key3":"value3","key2":"value2","key1":"value1"}}

那么前缀空对象(即{})的处理是什么?我做了一些显然很愚蠢的事情,或者MappingJackson2JsonView对新的Async功能不起作用吗?

F.Y.I这是我的Spring MVC bean配置:

<bean
    class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="order" value="1" />
    <property name="contentNegotiationManager">
        <bean class="org.springframework.web.accept.ContentNegotiationManager" />
    </property>
    <property name="defaultViews">
        <list>
            <bean
                class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />
        </list>
    </property>
</bean>

<bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="order" value="2" />
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

1 个答案:

答案 0 :(得分:1)

我真的想评论而不是“回答”这个,但我还是无法做到。我得到的结果与你相同。 MappingJackson2JsonView似乎与DeferredResult无法正常工作。此外,一旦我更新到Spring 3.2.3,生成的JSON前缀为{}&amp;&amp; {}即使我在我的配置中:<property name="prefixJson" value="false" />

我最初尝试解决此问题涉及编写HttpServletRequestWrapper和过滤器,我可以从中删除结果,但即使这样也不能在Async Servlet中很好地发挥作用。

我发现为我的特定应用程序工作的唯一方法是使用JavaScript过滤掉额外的垃圾。虽然这有效,但它确实让我想要自杀或者至少拉出一两个指甲。

我知道这不是很有帮助。我希望你能找到一些安慰,因为我也在为这个看似简单的球痛而哭泣。