0

私はJSONPを使用してSpringMVCのコントローラーサービスを呼び出しています。コールバックにラップされた結果を返すカスタムフィルターがあります。この例、http://jpgmr.wordpress.com/2010/07/28/tutorial-implementing-a-servlet-filter-for-jsonp-callback-with-springs-delegatingfilterproxy/を使用しました。ContentNegotiatingViewResolverも使用していますが、結果はコールバックでXMLを返し続けます。なぜそれを続けるのでしょうか?

jQuery1509349652162468509_1300839533498(<?xml version="1.0" encoding="UTF-8" standalone="yes"?><followResponse><id>0</id></followResponse>);

サーブレット-context.xml

<beans:bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <beans:property name="order" value="1"/>
        <beans:property name="mediaTypes">
            <beans:map>
                <beans:entry key="json" value="application/x-json"/>
                <beans:entry key="json" value="text/json"/>
                <beans:entry key="json" value="text/x-json"/>
                <beans:entry key="json" value="application/json"/>
                <beans:entry key="xml" value="text/xml"/>
                <beans:entry key="xml" value="application/xml"/>
            </beans:map>
        </beans:property>
        <beans:property name="defaultViews">
            <beans:list>
                <beans:bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
                <beans:bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                    <beans:property name="marshaller">
                        <beans:bean class="org.springframework.oxm.xstream.XStreamMarshaller" />
                    </beans:property>
                 </beans:bean>
            </beans:list>
        </beans:property>
    </beans:bean>
4

4 に答える 4

1

私の推測では、コントローラーメソッドは@ResponseBodyを使用しており、返されるモデルオブジェクトはJaxb2アノテーション(具体的には@XmlRootElement)でマークアップされています。

私はあなたが抱えているのと同じ問題を抱えていました。問題は、@ResponseBodyがContentNegotiatingViewResolverをバイパスすることです。これを確認するには、「resolveViewName」などのContentNegotiatingViewResolverのメソッドにいくつかのブレークポイントを追加し、実際にヒットするかどうかを確認します(ヒットしない)。

私が使用している現在の回避策は、実際にjsonビューを宣言し、それを具体的に使用することです。

次のようなものをxmlに追加する必要があります。

<bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>

次に、リストアイテムを次のように変更することもできます。

<beans:ref bean="jsonView" />

コントローラメソッドは、次のようにModelAndViewを返します。

@RequestMapping(value = "/{username}/get.json", method = RequestMethod.GET)
public ModelAndView getUser(@PathVariable String username) {
    User user = service.getUser(username);
    return new ModelAndView("jsonView", "user", user);
}

または、ビューを文字列として返し、メソッドシグネチャにModelMapの宣言を追加することもできます。

@RequestMapping(value = "/{username}/get.json", method = RequestMethod.GET)
public String getUser(@PathVariable String username, ModelMap model) {
    User user = service.getUser(username);
    model.addAttribute("user", user);
    return "jsonView";
}

お役に立てれば。

(注:これをメモリから入力するため、構文エラーなどが発生する可能性があります)

この問題に対するより洗練された解決策はまだ見つかりませんが、見つけた場合は、ここに投稿します。

編集:

@ResponseBodyを削除してみてください。これを行うと、MessageConvertersはアクティブ化されず、ContentNegotiatingViewResolverがトリガーされます。この時点で、ビューを決定するのは拡張機能である必要があります(セットアップに基づいて)。

@ResponseBodyを削除する以外に変更する必要はありません。戻り値のタイプは同じままです。

于 2011-03-23T15:34:47.483 に答える
0

リクエストのAcceptヘッダーを確認してください。

于 2011-03-23T08:04:40.563 に答える
0

私のブログ投稿があなたのインスピレーションであったのを見てうれしいです!:-D

依存関係にJacksonマッパーAPIを追加しましたか?Spring MVCアプリを作成する場合、デフォルトでは存在しません。自分で追加する必要があります。そうすれば、JSONへの応答をマーシャリングする必要があります。

于 2011-03-23T11:02:00.240 に答える
0

私の一時的な解決策は、XMLを取得して当面JSONに変換するJSONパーサーを使用することでした。ええ、それをXMLに解析してからJSONに戻すのは面倒ですが、今のところ、これは機能する必要があります。

String xml = new String(wrapper.getData());

            if(!StringUtils.isEmpty(xml))
            {
                XMLSerializer xmlSerializer = new XMLSerializer(); 
                JSON json = xmlSerializer.read( xml );  
                out.write(json.toString().getBytes());
            }

            out.write(new String(");").getBytes());
于 2011-03-23T16:05:04.887 に答える