12

これがこのサイトにとって有効な質問かどうかはわかりませんが、ContentNegotiatingViewResolver の経験がある人がこれを調べて、正しく設定したかどうかを知らせ、404 メッセージの送信を手伝ってくれるかどうか疑問に思っていました.

私がやりたいことは、拡張子のないすべての URL をデフォルトで HTML 表現にすることです (私の場合は freemarker ビューです)。「.json」が追加された URL を受け入れて、代わりに json をレンダリングしたいと思います。これは、Firefox、つまり Chrome で動作するようです。他のブラウザでは動作すると思いますか?ドキュメントに記載されているように実際には機能しない邪悪な機能であるため、acceptヘッダーを無効にするようにしました。

「.stuff」を使用して URL にアクセスしようとしましたが、何が起こるかを確認しただけで、私の構成では空白の画面が表示されます。これは受け入れられますか?404 エラーを送信する方法はありますか?

正しく構成されていない可能性があるものは他にありますか?

<bean id="contentNegotiatingViewResolver"
      class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="order" value="1"/>
    <property name="ignoreAcceptHeader" value="true" />
    <property name="defaultContentType" value="text/html" />
    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json"/>
        </map>
    </property>
    <property name="useNotAcceptableStatusCode" value="true" />
    <property name="defaultViews">
        <list>
            <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
                <property name="contentType" value="application/json" />
            </bean>
        </list>
    </property>
    <property name="viewResolvers">
        <list>
            <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
                <property name="contentType" value="text/html" />
                <property name="order" value="2"/>
                <property name="cache" value="true"/>
                <property name="prefix" value=""/>
                <property name="suffix" value=".ftl"/>
                <property name="exposeSpringMacroHelpers" value="true"/>
            </bean>
        </list>
    </property>
</bean>
4

2 に答える 2

1

defaultContentType が設定されているため、ネゴシエーションは常に、freemarker ビューによって配信される一致するコンテンツ タイプを見つけることになります。ContentNegotiatingViewResolver の javadoc からの引用:

setDefaultContentType を直接設定することもできます。これは、他のメカニズム (Accept ヘッダー、ファイル拡張子、またはパラメーター) が一致しない場合に返されます。

この設定では、ファイル拡張子 .stuff が contentType text/html に一致します。

次に、useNotAcceptableStatusCode を使用します。

一致するものが見つからない場合は、406 (受け入れられません) ステータス コードが返されます。

これを (別の REST サービス アプリの設定で) 試してみたところ、Chrome が次のメッセージを表示しているのを見ました。

于 2012-01-02T18:19:01.597 に答える
0

「.stuff」の url-pattern を web.xml に追加しましたか? 私は PathExtensionContentNegotiationStrategy を使用していますが、同じ理由である必要があります。Spring サーブレットはこのリクエストに応答できないため、500 または 416 ではなく 404 エラーが発生しました。

于 2013-08-30T05:26:58.633 に答える