Правильно ли настроен мой Spring-MVC ContentNegotiatingViewResolver? Как отправить ошибку 404 для неподдерживаемых типов носителей? - PullRequest
12 голосов
/ 23 ноября 2011

Я не знаю, является ли это действительным вопросом для этого сайта, но мне было интересно, может ли кто-нибудь, имеющий опыт работы с ContentNegotiatingViewResolver, просмотреть это и сообщить мне, правильно ли я его настроил, и помочь мне отправить 404 сообщения.*

Что я хотел бы сделать, это сделать все URL-адреса без расширения по умолчанию для представления HTML (что в моем случае является представлениями свободного маркера).Я хотел бы принять URL с добавленным к ним «.json» для рендеринга json.Это похоже на работу в Firefox, то есть и Chrome.Я предполагаю, что это работает в других браузерах?Я удостоверился, что отключил заголовок accept, потому что это злая функция, которая на самом деле не работает, как написано в документации.

Я попытался получить доступ к URL с помощью ".stuff", просто чтобы посмотреть, что происходит,и с моей конфигурацией происходит пустой экран.Это приемлемо?Можно ли как-нибудь отправить ошибку 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>

Ответы [ 2 ]

1 голос
/ 02 января 2012

Поскольку у вас установлен defaultContentType, согласование всегда заканчивается поиском подходящего типа контента, предоставляемого представлением freemarker. Цитата из Javadoc ContentNegotiatingViewResolver:

Вы также можете напрямую установить setDefaultContentType, который будет возвращается, когда другие механизмы (Принять заголовок, расширение файла или параметр) не приводит к совпадению.

С этим параметром расширение файла .stuff соответствует contentType text / html.

Затем с использованием NotAcceptableStatusCode:

406 (Недопустимо) код состояния будет возвращен, если не найдено совпадений найдено.

Я только что попробовал это (с настройками другого приложения-службы REST) ​​и увидел, что Chrome показывает сообщение: Ресурс, идентифицированный этим запросом, способен генерировать ответы только с характеристиками, не приемлемыми в соответствии с заголовками запроса «принять» () .

0 голосов
/ 30 августа 2013

Вы добавили шаблон URL для ".stuff" в web.xml? Я использую PathExtensionContentNegotiationStrategy, но по той же причине. Поскольку весенний сервлет не может ответить на этот запрос, поэтому получил ошибку 404, а не 500 или 416. Если это 416, он должен был вызвать некоторый заголовок, который может быть исправлен путем изменения jQuery seeting или заголовка клиента http.

...