Tôi có nhiều dịch vụ có thể trả về kết quả trong số hàng ngàn lớp học.
Vì mỗi dịch vụ CXF chứa bối cảnh JAXB riêng gần như giống nhau, nó gây ra một sự lãng phí bộ nhớ rất lớn.
Có cách nào để tự tạo bối cảnh JAXB và chia sẻ nó giữa các dịch vụ không?Sử dụng lại bối cảnh CXF jaxb giữa nhiều dịch vụ
Trả lời
Một cách tốt để giải quyết nó bằng cách thêm những điều sau đây để cấu hình mùa xuân:
<bean class="org.apache.cxf.jaxb.JAXBDataBinding" >
<constructor-arg index="0" value="#{GlobalContextBean.context}"/>
</bean>
Trường hợp giá trị chỉ là một tham chiếu đến một bean mà giữ toàn cầu (đơn) JAXBContext và có phương pháp sau đây :
public javax.xml.bind.JAXBContext getContext() {...}
Bạn có thể xem chi tiết hơn (bao gồm cả guru CXF Daniel Kulp đầu vào) trong các chủ đề sau:
Reuse-JAXB-context-in-jaxws
Sau khi thử nghiệm, tôi phát hiện ra rằng việc thiết lập JAXBDataBinding hiện tại là một cá thể chung cho nhiều dịch vụ sẽ không hoạt động vì có một câu lệnh if trong phương thức khởi tạo của nó trả về một khi ngữ cảnh được thiết lập bởi dịch vụ đầu tiên.
Đó là lý do tại sao tôi đã kết thúc bằng cách mở rộng lớp học và thu thập tất cả các lớp dịch vụ theo yêu cầu và mô hình. Sau khi tất cả các khởi tạo dịch vụ kết thúc, tôi tạo một bối cảnh chung với tất cả các lớp bắt buộc và trả về tất cả các dịch vụ.
Bạn có thể sử dụng lớp sau.
Sau khi tất cả các dịch vụ web của bạn được khởi tạo, hãy gọi phương thức compileGlobalJAXBContext để tạo ngữ cảnh chung. Bạn có thể thêm các lớp khác mà ứng dụng cần và init bị bỏ qua.
Đừng quên định cấu hình các dịch vụ để làm việc với bean này.
public class GlobalJAXBDataBinding extends JAXBDataBinding
{
private Set<Class<?>> globalContextClasses;
private boolean contextBuilt = false;
public GlobalJAXBDataBinding(Set<Class<?>> classes) {
globalContextClasses = new HashSet<>(classes);
globalContextClasses.add(CPUUID.class);
}
public GlobalJAXBDataBinding() {
}
}
public synchronized void initialize(Service service) {
if (contextBuilt)
return;
super.initialize(service);
globalContextClasses.addAll(getContextClasses());
super.setContext(null);
}
public void compileGlobalJAXBContext() {
if (contextBuilt) return;
setContext(JAXBContext.newInstance(globalContextClasses));
contextBuilt *equals* true;
}
Đối với một số lý do lạ biên tập viên không cho tôi thêm dấu bằng ở dòng cuối cùng của compileGlobalJAXBContext vì vậy chỉ cần thay thế các bằng chữ với dấu hiệu có liên quan.
Tôi đánh giá cao đây là một chút cũ bây giờ, nhưng bạn có phiền khi đăng lớp nếu bạn vẫn còn có nó? – DarthPablo
@DarthPablo Tôi đã đính kèm lớp học –
Cảm ơn bạn - điều đó rất hữu ích! – DarthPablo
- 1. Nhận bối cảnh trong Dịch vụ
- 2. Dịch vụ web với CXF: Cách sử dụng ResponseWrapper?
- 3. Android App Bối cảnh: sử dụng nhiều hình ảnh
- 4. Quyết định giữa bối cảnh hoạt động hoặc bối cảnh ứng dụng để khởi tạo SQLiteOpenHelper
- 5. JAXB tạo bối cảnh và marshallers chi phí
- 6. SharedPreferences bối cảnh ứng dụng và bối cảnh hoạt động
- 7. Sử dụng xmlbeans bindings cho cxf wsdl2java
- 8. Bối cảnh số nhiều liên kết Turbolinks
- 9. Ứng dụng khách dịch vụ Web Applet, với Eclipse Indigo sử dụng Apache CXF,
- 10. Sự khác biệt giữa, tải lại dịch vụ và khởi động lại dịch vụ là gì?
- 11. Trình biên dịch Mono có thể được sử dụng trong một bối cảnh gỡ rối không?
- 12. Apache CXF, tạo các dịch vụ web từ tệp WSDL
- 13. Vai trò của JAXB trong các Dịch vụ Web dựa trên Java
- 14. Trả lại JSON từ một dịch vụ RESTful bằng CXF DOSGI
- 15. Cách triển khai dịch vụ web Apache CXF cho Glassfish
- 16. Xác định dịch vụ/phương pháp đích từ CXF Interceptor
- 17. Spring MVC, nhận nguyên tắc chính từ bối cảnh bảo mật trong lớp dịch vụ
- 18. Nhiều bối cảnh 'with` tuyên bố trong Python 2.6
- 19. bối cảnh trong Haskell loại nhanh và nhiều lớp
- 20. Trình hướng dẫn khách hàng dịch vụ Web Eclipse và CXF
- 21. Sử dụng threading.Lock như quản lý bối cảnh
- 22. Sử dụng bối cảnh để bắt đầu Hoạt động khác
- 23. Thanh tác vụ theo bối cảnh với DialogFragment
- 24. Làm thế nào để phân biệt nếu đối tượng bối cảnh nhất định là một Hoạt động hoặc một bối cảnh dịch vụ?
- 25. soapaction trong WSDL sử dụng CXF
- 26. Làm thế nào để yêu cầu Apache CXF sử dụng java.util.Date trong Spring Configuration
- 27. Chia sẻ một logfile giữa nhiều dịch vụ (mỗi dịch vụ có nhiều luồng), làm thế nào?
- 28. CXF và nhiều ánh xạ servlet
- 29. Biên dịch nhiều lược đồ thành các gói khác nhau bằng cách sử dụng JAXB 2.1
- 30. Sử dụng các dịch vụ khai báo OSGi trong ngữ cảnh của một thử nghiệm JUnit
Câu hỏi thú vị, nhưng tôi không biết câu trả lời. –
Điều này là dành cho jaxrs, nhưng có thể nó sẽ làm việc cho jaxws quá: http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-SingleJAXBContextandextrauserclasses –