2011-11-23 7 views
12

No sé si esta es una pregunta válida para este sitio, pero me preguntaba si alguien con experiencia en ContentNegotiatingViewResolver podría ver esto y dejarme saber si lo configuré correctamente y si me ayudó a enviar mensajes 404.¿Está configurada correctamente My Spring-MVC ContentNegotiatingViewResolver? ¿Cómo puedo enviar un error 404 para tipos de medios no compatibles?

Lo que me gustaría hacer es hacer que todas las direcciones URL sin extensión tengan por defecto la representación HTML (que es vistas de freemarker en mi caso). Me gustaría aceptar las URL con ".json" adjunto a ellos para representar a json en su lugar. Esto parece funcionar en Firefox, es decir, y Chrome. Supongo que funciona en otros navegadores. Me aseguré de desactivar el encabezado de aceptación porque es una característica maligna que realmente no funciona como dice la documentación.

He intentado acceder a las URL con ".stuff", solo para ver qué sucede, y con mi configuración, aparece una pantalla en blanco. ¿Es esto aceptable? ¿Hay alguna forma en que pueda enviar un error 404?

¿Hay algo más que no haya configurado correctamente?

<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> 

Respuesta

1

Debido a que tiene defaultContentType conjunto, la negociación siempre termina la búsqueda de un tipo de contenido coincidente entregado por la vista FreeMarker. Una cita de la javadoc de ContentNegotiatingViewResolver:

También puede establecer directamente la setDefaultContentType, que será devuelto cuando los otros mecanismos (Aceptar cabecera, extensión de archivo o parámetro) no resultan en un partido.

Con esta configuración, la extensión de archivo .stuff coincide con contentType text/html.

Luego, con useNotAcceptableStatusCode:

406 (no aceptable) código de estado será devuelto si no hay coincidencia es encontrado.

Acabo de probar esto (con la configuración de otra aplicación de servicio REST) ​​y vi a Chrome mostrando el mensaje: El recurso identificado por esta solicitud solo es capaz de generar respuestas con características no aceptables según la solicitud "aceptar" encabezados().

0

¿Agregó url-pattern para ".stuff" a web.xml? Estoy usando PathExtensionContentNegotiationStrategy, pero debería ser el mismo motivo. Debido a que el servlet de primavera no puede responder a esta solicitud, también obtuvo el error 404, no 500 o 416. Si es 416, debería causar algún encabezado, se puede arreglar mediante el cambio de jQuery seeting o el encabezado del cliente http.

Cuestiones relacionadas