2013-01-07 35 views
6

Hiện tại chúng tôi có một webapp Java với một Spring MVC DispatcherServlet và hai CXFServlets. DispatcherServlet là servlet mặc định (ánh xạ /), một bản đồ CXFServlet là /api/*, cái kia là /services/*.CXF và nhiều ánh xạ servlet

Điều gì làm tôi khó chịu, có vẻ như không thể có 1 CXFServlet lưu trữ 2 dịch vụ, một trên /api/v0 và một trên /services/myService mà không cần ánh xạ /* tới CXFServlet. Nếu điều này là có thể, nó sẽ tiết kiệm thời gian khởi tạo, cấu hình rắc rối và yêu cầu bộ nhớ của một cá thể servlet khác. Vì vậy, về cơ bản, câu hỏi của tôi là nếu có ai biết cách lưu trữ 2 dịch vụ CXF trên 2 URL trong 1 CXFServlet, không có URL cơ sở/root chung, tốt nhất là sử dụng cấu hình không gian tên Spring, mà không cần ánh xạ /* tới CXFServlet?

Trả lời

3

Phương pháp invoke của CXF ServletController cuộc gọi đầu tiên HttpServletRequest#getPathInfo, mà trả về một phần của URL được yêu cầu mà không servlet của url-pattern. Kết quả của cuộc gọi này sau đó được sử dụng để khớp với bất kỳ dịch vụ được xác định nào thông qua một cuộc gọi đến DestinationRegistry#getDestinationForPath. Do đó, hiện tại không thể có các dịch vụ phù hợp CXF bằng cách sử dụng đường dẫn có phần servlet được bao gồm - CXF không bao giờ gọi số HttpServletRequest#getServletPath cần thiết cho việc này.

Lưu ý rằng giá trị base-address có thể được thiết lập trong các tham số khởi động của servlet (<init-param>) sẽ chỉ ảnh hưởng đến bất kỳ URL CXF màn, vì ServletController#getBaseURL phương pháp sử dụng giá trị này không được sử dụng trong dịch vụ gọi.

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