3

我正在尝试将 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不能很好地使用新的异步功能?

仅供参考,这是我的 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>
4

1 回答 1

1

我真的很想评论而不是“回答”这个问题,但我还不能这样做。我得到和你一样的结果。MappingJackson2JsonView似乎无法与 DeferredResult 一起正常工作。此外,一旦我更新到 Spring 3.2.3,生成的 JSON 会在前面加上 {} && {},即使我的配置中有:<property name="prefixJson" value="false" />

我最初尝试解决这个问题涉及编写一个HttpServletRequestWrapper和一个过滤器,我可以从中擦洗结果,但即使这在 Async Servlet 领域似乎也不能很好地发挥作用。

我发现适用于我的特定应用程序的唯一方法是使用 JavaScript 过滤掉多余的垃圾。虽然这行得通,但它确实让我想自杀,或者至少拔出一两个指甲。

我知道这不是很有帮助。我希望你能从我也为这种看似简单的蛋蛋痛苦而哭泣的事实中找到一些安慰。

于 2013-05-22T19:56:48.923 回答