2010-09-23 28 views
6

Tôi có một ứng dụng web mới được đóng gói như một WAR như một phần của dự án Maven đa mô-đun. Tệp applicationContext.xml cho tham chiếu WAR này được nhập từ mô-đun "dịch vụ", lần lượt nhập các bean từ mô-đun "dao". Những tuyên bố nhập khẩu applicationContext.xml trông như thế này:Nhập hạt đậu mùa xuân từ các mô-đun Maven khác bên trong một WAR?

<import resource="classpath*:service.xml" /> 

và một bên trong tập tin service.xml trông như thế này:

<import resource="classpath*:dao.xml" /> 

Cả mùa xuân STS, cũng không phải Eclipse hiển thị bất kỳ cảnh báo hay lỗi trong các tệp bean của tôi. Tôi tham khảo đậu nhập khẩu trên khắp nơi. Việc xây dựng Maven hoạt động tốt và các bài kiểm tra tích hợp DAO tất cả vượt qua (họ sử dụng đậu). Tôi chưa có bất kỳ thử nghiệm tích hợp dịch vụ nào.

Nhưng khi tôi khởi động WAR trong Jetty tôi nhận được một lỗi:

Error creating bean with name 'securityService' 
Cannot resolve reference to bean 'userDAO' while setting constructor argument 

Tất cả các tập tin XML đậu nhập khẩu có thể được tìm thấy bên trong các tập tin JAR của mình trong thư mục WEB-INF/lib. Thật vậy, bean dịch vụ đã ném lỗi được tự xác định bên trong tệp service.xml bên trong tệp JAR của mô-đun dịch vụ.

Dường như mô-đun dịch vụ không thể tìm thấy hạt mà nó đã nhập từ mô-đun dao. Rõ ràng là tôi không hiểu điều gì đó ... có vẻ như việc này chỉ nên làm việc?

Trả lời

6

Tôi đã bật ghi nhật ký DEBUG cho 'org.springframework' để xem tôi có thể tìm hiểu gì không. Những gì tôi tìm thấy là các thông điệp có hiệu lực là các hạt DAO đã được tạo ra, nhưng cũng có một thông điệp về chúng không có tên hoặc id.

Tôi kiểm tra tệp và tất cả đều có id. Vậy nó là gì?Tôi kiểm tra không gian tên XML và cưa:

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" 

và nhận thấy nó đã già (Tôi đang sử dụng Spring 3.0.2) và thay đổi nó để:

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 

Khi tôi thay đổi nó, Spring ngay lập tức ném một nửa một tá lỗi liên quan đến đậu đã được xác định không chính xác (nhưng không bao giờ được sử dụng rõ ràng). Một khi tôi đã sửa những lỗi đó, mọi thứ đều hoạt động. Tôi đã đi qua toàn bộ hệ thống kiểm tra các phiên bản vùng tên tệp Spring XML.

Nhờ tất cả vì sự trợ giúp. Không thể tin rằng tôi lãng phí một ngày vào sự ngu ngốc này !!

+11

* Không thể tin rằng tôi lãng phí một ngày vào sự ngu ngốc này * Đó sẽ không phải là lần cuối cùng. Theo kinh nghiệm của tôi, việc xây dựng chức năng tuyệt vời sẽ tốn ít thời gian hơn rất nhiều so với việc theo dõi các lỗi vô tội ngu ngốc. –

1

Nó phải là như

<import resource="classpath:service.xml"/> 
+0

Nếu tôi thực hiện điều này thì Spring STS, Eclipse đều cảnh báo về các bean không xác định và bản dựng không thành công các bài kiểm tra tích hợp vì các bean không xác định. – HDave

+0

@ Xin lỗi, tôi đã đặt không đúng chỗ, cập nhật ans. –

+0

Không sao cả. Cảm ơn đã giúp đỡ. Thật không may, tôi vẫn có cùng một vấn đề. Tuy nhiên, Spring STS, Eclipse và Maven dường như không để ý đến dấu hoa thị còn thiếu! – HDave

2

Sự khác biệt giữa các ký hiệu classpath:thingy.xmlclasspath*:thingy.xml là cựu sử dụng cơ chế classpath tiêu chuẩn để giải quyết một nguồn (sử dụng ClassLoader.getResource(name)), trong khi sau này sẽ sử dụng ClassLoader.getResources(name) để lấy tất cả phù hợp với tài nguyên trên classpath, một sự phân biệt nên không liên quan trong tình huống của bạn như tôi đoán chỉ có một tập tin dao.xml trên đường dẫn lớp.

Tôi nghĩ vấn đề của bạn khác, bạn đang thiếu dấu gạch chéo hàng đầu.

Sử dụng này cho một nguồn duy nhất

<import resource="classpath:/dao.xml" /> 

và điều này cho nhiều tài nguyên

<import resource="classpath*:/dao.xml" /> 

Xem

+0

Tốt biết về dấu sao, cảm ơn cho các liên kết. Đặt dấu gạch chéo hàng đầu nó đã không có hiệu lực, tuy nhiên. – HDave

+0

Bạn đã xác minh rằng các tệp xml có thực sự nằm trong các lọ không? –

+0

Có. Tôi mở cuộc chiến, sau đó tìm thấy các lọ, sau đó mở lọ và tìm thấy các tập tin xml, và sau đó mở các tập tin xml và tìm thấy các hạt cà phê. – HDave

0

Bạn có nhiều ứng dụngContext và có thể ngữ cảnh gốc đang đề cập đến một bean được xác định trong ngữ cảnh con?

+0

Với những kiến ​​thức tốt nhất của tôi, tôi chỉ có một ứng dụngContext và tất cả các bean phải ở trong một ngữ cảnh đó. – HDave

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