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?
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
@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ộ –