SpringMVC3アプリでコンテンツネゴシエーションを次のように構成しました。
<bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="0" />
<property name="favorPathExtension" value="true" />
<property name="defaultContentType">
<ref bean="htmlMediaType" />
</property>
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</map>
</property>
<property name="defaultViews">
<list>
<bean
class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
<property name="objectMapper" ref="jacksonObjectMapper" />
</bean>
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
<property name="marshaller">
<bean class="org.springframework.oxm.castor.CastorMarshaller" />
</property>
</bean>
</list>
</property>
<property name="viewResolvers">
<ref bean="tilesViewResolver" />
</property>
</bean>
これは非常にうまく機能します。すべてのビューは、「通常の」ビューテンプレートを使用したhtmlビューとして、または「Accept」ヘッダーに応じてビューモデルデータのJSONまたはXMLダンプとしてレンダリングされます。
しかし、これは私にはちょっとしたセキュリティホールのようです。私のアクションのいくつかはAPIスタイルのアクションであり、HTML、JSON、またはXMLで合法的に利用できます。ただし、一部のビューはHTMLのみを対象としています。URLに「.json」を追加するだけでエンドユーザーがすべてのビューデータを表示できるようにしたくはありません。
Spring MVCでコンテンツネゴシエーションを行う方法はありますが、明示的にオプトインしているアクションに対してのみです。次のようなコントローラーアノテーションを設定できます@RespondsTo("xml", "json")
か?