2009-05-12 14 views
5

Tôi đang cố gắng để trưng ra một dịch vụ REST đầy đủ (được lưu trữ bởi Tomcat) và không thể tìm ra cấu hình cần thiết cho Spring 3 (M3) là gì.Cấu hình tối thiểu cho dịch vụ chú thích đầy đủ REST được xây dựng trên Spring 3 (m3) là gì?

Đây là cách (ví dụ) dịch vụ trông giống như:

@Controller 
@Scope("prototype") 
public class UsersController 
{ 
    @RequestMapping(value="https://stackoverflow.com/users/hello", method=RequestMethod.GET) 
    public String hello() 
    { 
     return "hello, user!"; 
    } 
} 

Các cấu hình Spring rằng tôi có trông như thế này (tôi bỏ qua tên lớp đầy đủ cho đơn giản):

<beans ...> 
    <context:annotation-config /> 
    <bean class="...AutowiredAnnotationBeanPostProcessor"/> 
    <bean class="...DefaultAnnotationHandlerMapping"> 
    <context:component-scan base-package="com.mycompany.myserver"/> 
</beans> 

này là cách tôi đã cắm cấu hình Spring vào web.xml:

<listener> 
      <listener-class>...RequestContextListener</listener-class> 
    </listener> 
    <!-- Servlets --> 
    <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>...DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>classpath:*:dispatcher-servlet.xml</param-value> 
     </init-param> 
     <load-on-startup>2</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>/services/*</url-pattern> 
    </servlet-mapping> 

Lưu ý rằng tôi đang cố gắng tạo cấu hình tối thiểu (không có tệp servlet-config.xml bổ sung). Đây là lý do tại sao tôi trỏ Trình điều phối đến cấu hình được cài sẵn.

Điều này có đúng không?

Sau khi tôi bắt đầu Tomcat và tất cả các hạt cà phê được nạp Tôi đang hướng đến URL sau: "hello, người sử dụng"

http://localhost:8080/myserver/services/users/hello 

Và, thay vì trả lời, để mất tinh thần của tôi, tôi thấy các lỗi sau đây trong file log:

09:54:45,140 DEBUG RequestContextListener:69 - Bound request context to thread: [email protected] 
09:54:45,140 DEBUG DispatcherServlet:834 - DispatcherServlet with name 'dispatcher' determining Last-Modified value for [/myserver/services/users/hello] 
09:54:45,156 DEBUG DefaultAnnotationHandlerMapping:178 - Mapping [/users/hello] to handler '[email protected]' 
09:54:45,171 DEBUG DispatcherServlet:850 - Last-Modified value for [/myserver/services/users/hello] is: -1 
09:54:45,171 DEBUG DispatcherServlet:683 - DispatcherServlet with name 'dispatcher' processing GET request for [/myserver/services/users/hello] 
09:54:45,218 DEBUG HandlerMethodInvoker:148 - Invoking request handler method: public java.lang.String com.symantec.repserver.myserver.UsersController.hello() 
09:54:45,218 DEBUG DefaultListableBeanFactory:1366 - Invoking afterPropertiesSet() on bean with name 'hello, user!' 
09:54:45,218 DEBUG DispatcherServlet:1060 - Rendering view [org.springframework.web.servlet.view.InternalResourceView: name 'hello, user!'; URL [hello, user!]] in DispatcherServlet with name 'dispatcher' 
09:54:45,234 DEBUG InternalResourceView:237 - Forwarding to resource [hello, user!] in InternalResourceView 'hello, user!' 
09:54:45,250 DEBUG DispatcherServlet:834 - DispatcherServlet with name 'dispatcher' determining Last-Modified value for [/myserver/services/users/hello, user!] 
09:54:45,250 DEBUG DispatcherServlet:842 - No handler found in getLastModified 
09:54:45,250 DEBUG DispatcherServlet:683 - DispatcherServlet with name 'dispatcher' processing GET request for [/myserver/services/users/hello, user!] 
09:54:45,250 WARN PageNotFound:959 - No mapping found for HTTP request with URI [/myserver/services/users/hello, user!] in DispatcherServlet with name 'dispatcher' 
09:54:45,250 DEBUG DispatcherServlet:643 - Successfully completed request 
09:54:45,250 DEBUG DispatcherServlet:643 - Successfully completed request 
09:54:45,250 DEBUG RequestContextListener:89 - Cleared thread-bound request context: [email protected] 

Như bạn thấy, cấu hình hiện tại của tôi đang cố gắng để định tuyến lại yêu cầu này như một yêu cầu mới:

/myserver/services/users/hello, user! 

Bất kỳ ý tưởng chuyện gì thế? Tôi đang thiếu gì?

Trả lời

1

Vấn đề là xin chào bạn() phương pháp được chú thích là một handlerMethod để mùa xuân và mỗi tài liệu @RequestMapping, phương pháp xử lý có thể trả lại bất kỳ số đối tượng nhưng nếu nó trả về một String thì:

@Request Documentation

Giá trị chuỗi được hiểu là tên chế độ xem, với mô hình được xác định ngầm định thông qua các đối tượng lệnh và các phương thức truy cập dữ liệu tham chiếu có chú giải ModelAttribute. Phương thức xử lý cũng có thể lập trình làm phong phú thêm mô hình bằng cách khai báo một đối số ModelMap (xem ở trên)

Vì vậy, về cơ bản, tìm kiếm ánh xạ cho chuỗi đó bạn trả về 'hello, user' - không tồn tại. Bạn có thể có phương thức trả về void và bên trong phương thức tự viết ra cho chính HttpServletResponse.

Tiếp tục câu trả lời:

@RequestMapping(value="https://stackoverflow.com/users/hello", method=RequestMethod.GET) 
public void hello(Writer w) { 
    w.write("hello, user!"); 
    w.flush(); 
    return; 
} 

Bạn có thể muốn có được toàn bộ HttpServletResponse thay vì sau đó chỉ cần Writer, như vậy bạn có thể thiết lập Http Headers thích hợp.

Xin lỗi bình luận của tôi dưới đây là lộn xộn, tôi mới vào trang web này.

+0

Hmm ... Nhưng sau đó nó phá vỡ toàn bộ ý tưởng JAX-RS, tuyên bố rằng giá trị trả lại của phương thức được gửi đến bên yêu cầu. Có cách nào để chú thích các phương pháp của tôi để yêu cầu trên có đúng không? – IgorM

+1

Mỗi javadoc là phương thức của bạn lấy một đối số của OutputStream hoặc Writer, RequestMapper sẽ chuyển vào trong ServletOutputStream/Writer để bạn ghi vào. Tôi không chắc đây có phải là cách tốt nhất để giải quyết vấn đề này, nhưng nó sẽ hoạt động. @RequestMapping (giá trị = "/ người dùng/hello", phương thức = RequestMethod.GET) void công cộng hello (Writer w) { w.write ("hello, user!"); w.flush(); trả lại; } Bạn có thể muốn nhận toàn bộ HttpServletResponse thay vì chỉ là Writer, theo cách đó bạn có thể đặt Tiêu đề Http thích hợp. – Gandalf

+0

Bạn có thể ghi phản hồi trực tiếp vào luồng như đề xuất ở trên hoặc bạn có thể trả về đối tượng ModelAndView làm điều đó. Hiệu quả là như nhau. Sẽ rất tuyệt nếu Spring 3 sử dụng mẫu HttpMessageConverter mới để xử lý các giá trị trả về của phương thức, nhưng ssdly chúng chỉ áp dụng cho @RequestBody. Các giá trị trả về của phương thức vẫn được hiểu như trong Spring 2.5 Hãy nhớ rằng Spring REST MVC là * không * tuân thủ JAX-RS, đó là một sự lựa chọn rõ ràng mà chúng tạo ra. JAX-RS không phù hợp với Spring MVC. – skaffman

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