2011-11-23 23 views
12

Tôi không biết nếu đây là câu hỏi hợp lệ cho trang web này, nhưng tôi tự hỏi liệu có ai đó đã trải qua ContentNegotiatingViewResolver có thể xem qua và cho tôi biết nếu tôi thiết lập chính xác và cũng như giúp tôi gửi tin nhắn 404.Thiết lập Spring-MVC ContentNegotiatingViewResolver của tôi có chính xác không? Làm cách nào để gửi lỗi 404 cho các loại phương tiện không được hỗ trợ?

Điều tôi muốn làm là tạo tất cả các url không có phần mở rộng mặc định cho biểu diễn HTML (đây là chế độ xem freemarker trong trường hợp của tôi). Tôi muốn chấp nhận các url với ".json" được gắn vào chúng để thay thế json. Điều này dường như hoạt động trong firefox, tức là và chrome. Tôi đoán nó hoạt động trong các trình duyệt khác? Tôi đã đảm bảo vô hiệu hóa tiêu đề chấp nhận vì đó là một tính năng độc ác không thực sự hoạt động giống như tài liệu cho biết.

Tôi đã cố gắng truy cập các url bằng ".stuff", chỉ để xem điều gì xảy ra và với cấu hình của tôi, màn hình trống sẽ xảy ra. điều này có chấp nhận được không? Có cách nào tôi có thể gửi lỗi 404 không?

Có điều gì khác mà tôi có thể chưa định cấu hình đúng không?

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

Trả lời

1

Vì bạn có tập hợp DefaultContentType, thương lượng luôn kết thúc bằng cách tìm loại nội dung phù hợp do chế độ xem người sáng tạo cung cấp. Một câu nói từ javadoc của ContentNegotiatingViewResolver:

Bạn cũng có thể thiết lập các setDefaultContentType trực tiếp, mà sẽ trả lại khi các cơ chế khác (Chấp nhận tiêu đề, phần mở rộng tập tin hoặc tham số) không dẫn đến một trận đấu.

Với cài đặt này, tiện ích mở rộng tệp .theo nội dung phù hợp contentType text/html.

Sau đó, với useNotAcceptableStatusCode:

406 (Không được chấp nhận) mã trạng thái sẽ được trả lại nếu không phù hợp là được tìm thấy.

Tôi vừa thử (với cài đặt của ứng dụng dịch vụ REST khác) và thấy Chrome hiển thị thông báo: Tài nguyên được xác định bởi yêu cầu này chỉ có khả năng tạo phản hồi với các đặc điểm không được chấp nhận theo yêu cầu "chấp nhận" tiêu đề().

0

Bạn có thêm url-pattern cho ".stuff" vào web.xml không? Tôi đang sử dụng PathExtensionContentNegotiationStrategy, nhưng nên cùng một lý do. Bởi vì servlet mùa xuân không thể đáp ứng yêu cầu này, do đó, có lỗi 404, không phải 500 hoặc 416. Nếu là 416, nó sẽ gây ra một số tiêu đề, có thể được sửa bằng cách thay đổi tiêu đề jQuery seeting hoặc http.

Các vấn đề liên quan