3

好的,我有一个基于 spring mvc 的 json web 服务。这是一个测试应用程序,我在构建基于 spring mvc 的 restful json 服务时从未见过这样的问题。我的测试服务的输出总是返回空 json 对象,后跟 && 后跟我要返回的数据。所以结果看起来像这样:

{} && {"status":200,"serverTime":"2013 年 1 月 6 日 7:35:45 PM EST"}

我的控制器方法处理这个非常简单的 GET 请求的代码是:

    @RequestMapping(value = "/test.json", method = RequestMethod.GET)
public ModelMap test(ModelMap m, HttpServletRequest request,
        Locale locale) {
    Date date = new Date();
    DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG,
            DateFormat.LONG, locale);

    String formattedDate = dateFormat.format(date);

    m.addAttribute("serverTime", formattedDate);
    m.addAttribute("status", 200);

    return m;
}

我一生都无法弄清楚那个额外的空 {} json 对象是从哪里来的。我的弹簧配置如下所示:

<beans:bean
    class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <beans:property name="mediaTypes">
        <beans:map>
            <beans:entry key="html" value="text/html" />
            <beans:entry key="json" value="application/json" />
        </beans:map>
    </beans:property>
    <beans:property name="defaultViews">
        <beans:list>
            <beans:bean
                class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
                <beans:property name="prefixJson" value="true" />
            </beans:bean>
        </beans:list>
    </beans:property>
    <beans:property name="viewResolvers">
        <beans:list>
            <beans:bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
                <beans:property name="viewClass"
                    value="org.springframework.web.servlet.view.JstlView" />
                <beans:property name="prefix" value="/WEB-INF/views/" />
                <beans:property name="suffix" value=".jsp" />
            </beans:bean>
        </beans:list>
    </beans:property>

任何帮助将不胜感激。我在一个星期天花了 6 个小时试图弄清楚为什么会这样。

4

2 回答 2

4

MappingJacksonJsonViewjavadoc :

public void setPrefixJson(boolean prefixJson)

指示此视图的 JSON 输出是否应以“{} &&”为前缀。默认为假。以这种方式为 JSON 字符串添加前缀有助于防止 JSON 劫持。前缀使字符串作为脚本在语法上无效,因此它不能被劫持。此前缀不会影响 JSON 的评估,但如果对字符串执行 JSON 验证,则需要忽略该前缀。

那么您是否尝试将 prefixJson 设置为 false ?

<beans:bean
    class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <beans:property name="mediaTypes">
        <beans:map>
            <beans:entry key="html" value="text/html" />
            <beans:entry key="json" value="application/json" />
        </beans:map>
    </beans:property>
    <beans:property name="defaultViews">
        <beans:list>
            <beans:bean
                class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
                <beans:property name="prefixJson" value="false" />
            </beans:bean>
        </beans:list>
    </beans:property>
    <beans:property name="viewResolvers">
        <beans:list>
            <beans:bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
                <beans:property name="viewClass"
                    value="org.springframework.web.servlet.view.JstlView" />
                <beans:property name="prefix" value="/WEB-INF/views/" />
                <beans:property name="suffix" value=".jsp" />
            </beans:bean>
        </beans:list>
    </beans:property>
于 2013-01-07T01:12:51.517 回答
1

我收到了同样的东西,我犯了和你在你提供的代码中一样的错误:)我只是不小心忘记@ResponseBody在控制器方法中添加注释。

于 2013-02-07T10:11:46.043 回答