2012-11-12 18 views
5

Bạn không cần biết CXF để trả lời câu hỏi này.Sử dụng cấu hình Spring bên trong một không gian tên

Giả sử tôi có khai báo XML sau đó tạo ra một máy chủ JAXRS sử dụng CXF

<jaxrs:server id="customerService" address="/service1"> 
    <jaxrs:serviceBeans> 
     <ref bean="serviceBean1" /> 
     <ref bean="serviceBean2" /> 
     <ref bean="serviceBean3" /> 
    </jaxrs:serviceBeans> 
    </jaxrs:server> 

Bây giờ tôi cần phải tìm một cách để tùy chỉnh này JAXRS máy chủ cho mỗi môi trường, sử dụng cơ chế profiles mùa xuân. Tôi có thể làm điều gì đó như:

<beans profile="dev"> 
    <jaxrs:server id="jaxrsServer" address="/service1"> 
     <jaxrs:serviceBeans> 
     <ref bean="serviceBean2" /> 
     <ref bean="serviceBean3" /> 
     </jaxrs:serviceBeans> 
    </jaxrs:server> 
    </beans> 

    <beans profile="prod"> 
    <jaxrs:server id="jaxrsServer" address="/service1"> 
     <jaxrs:serviceBeans> 
     <ref bean="serviceBean1" /> 
     <ref bean="serviceBean2" /> 
     </jaxrs:serviceBeans> 
    </jaxrs:server> 
    </beans> 

Nhưng đó không phải là điều tôi muốn, vì máy chủ JAXRS thế giới thực của tôi phức tạp hơn một chút so với ví dụ của tôi.

Những gì tôi đang tìm kiếm là một cái gì đó như thế:

<jaxrs:server id="jaxrsServer" address="/service1"> 
    <jaxrs:serviceBeans> 
    <beans profile="dev"> 
     <ref bean="serviceBean1" /> 
     <ref bean="serviceBean2" /> 
    </beans> 
    <beans profile="dev"> 
     <ref bean="serviceBean2" /> 
     <ref bean="serviceBean3" /> 
    </beans> 
    </jaxrs:serviceBeans> 
</jaxrs:server> 

Nhưng nó không hoạt động.


Tôi cố gắng để ra bên ngoài tạo ra danh sách của tôi:

<bean id="serviceBeansList" class="java.util.ArrayList"> 
    <constructor-arg> 
     <list> 
     <ref bean="serviceBean1"/> 
     <ref bean="serviceBean2"/> 
     </list> 
    </constructor-arg> 
    </bean> 

<jaxrs:server id="jaxrsServer" address="/service1"> 
    <jaxrs:serviceBeans> 
     <ref bean="serviceBeansList" /> 
    </jaxrs:serviceBeans> 
</jaxrs:server> 

Nó vẫn không hoạt động vì handler CXF namespace không "flatten" danh sách, nên thay vì đối phó với một danh sách của 2 serviceBeans các đối tượng, nó đề cập đến một danh sách 1 ArrayList, không phải là một loại được xử lý bởi CXF.

Phân tích cú pháp XML trong mùa xuân cố gắng lấy danh sách. Tôi thấy rằng trong CXF xử lý mã namespace:

if ("serviceBeans".equals(name)) { 
      List<?> list = ctx.getDelegate().parseListElement(el, bean.getBeanDefinition()); 
      bean.addPropertyValue(name, list); 
} 

Thay vì tham khảo một bean, không cho nó có thể tham khảo một "đoạn khai xml" với mùa xuân hay cái gì khác mà có thể làm việc?

+0

As far as Tôi lo ngại, việc tạo customerService cho mỗi tiểu sử có vẻ là ý tưởng đẹp hơn – willome

+0

@willome customerService dài 200 dòng và chỉ 1 hoặc 2 dòng phải được sửa đổi giữa các cấu hình khác nhau. Đây không phải là một ý tưởng tốt để duy trì 200 dòng tương tự và giữ chúng đồng bộ –

Trả lời

1

Bạn đã cố gắng sử dụng bí danh + hồ sơ

<jaxrs:server id="jaxrsServer" address="/service1"> 
    <jaxrs:serviceBeans> 
    <ref bean="serviceBeanA" /> 
    <ref bean="serviceBeanB" /> 
    </jaxrs:serviceBeans> 
</jaxrs:server> 

<beans profile="profile1"> 
    <alias name="serviceBean1" alias="serviceBeanA"/> 
    <alias name="serviceBean2" alias="serviceBeanB" /> 
</beans> 
<beans profile="profile2"> 
    <alias name="serviceBean3" alias="serviceBeanA"/> 
    <alias name="serviceBean4" alias="serviceBeanB" /> 
</beans> 

từ chối trách nhiệm: câu trả lời này là một tưởng tượng thuần túy, nhưng các ý kiến ​​được phần nào hạn chế - Tôi sẽ loại bỏ nếu nó sẽ không làm việc

+0

Đây không phải là quá nhiều tưởng tượng thuần túy, vấn đề là nó chỉ hoạt động khi số lượng hạt dịch vụ để lộ là liên tục giữa các cấu hình :) –

+0

Hack này hoạt động tốt đối với tôi, bởi vì CXF không phải là thất bại nhanh khi chúng tôi cung cấp cho nó các tài nguyên không phải JAXRS: serviceBeans. Vì vậy, tôi chỉ cần khai báo nhiều bí danh trong thẻ của mình, và sau đó theo profile, ánh xạ các bí danh tới các tài nguyên JAXRS thực, hoặc giả. Đây là một chút bẩn nhưng được công việc làm :) –

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