2012-03-29 30 views
7

Tôi đang gặp sự cố với trường được chú thích là @Resource trong bean Spring. Những gì tôi có:Spring @Resource Handling

Một lĩnh vực, với phương pháp setter, chú thích @Resource

@Resource 
private URL someUrl; 

public void setSomeUrl(URL someUrl) { 
    this.someUrl = someUrl; 
} 

Một thẻ <env-entry> trong deployment descriptor của tôi (web.xml)

<env-entry> 
    <env-entry-name>someUrl</env-entry-name> 
    <env-entry-type>java.net.URL</env-entry-type> 
    <env-entry-value>http://somedomain.net/some/path</env-entry-value> 
</env-entry> 

Đơn không bắt đầu với một BeanCreationException, mà tôi không mong đợi bởi vì tôi không nhất thiết muốn mùa xuân để tiêm một bean quản lý mùa xuân. Tôi muốn Spring xử lý @Resource và truy xuất tài nguyên JNDI.

Đây là Spring 2.5.6SEC03 và chính bean được chú thích @Service để tự động chuyển thành các trường hợp @Component khác. Servlet container trong trường hợp này là Tomcat 7 nhưng cuối cùng sẽ được triển khai lên Weblogic 10, vì vậy trong khi tôi muốn lý tưởng cho một giải pháp để làm việc trên cả hai, Weblogic là phải có.

Tôi có sử dụng sai tính năng này trong Spring 2.5 không? Nói chung? Có một số bit tôi đang mất tích? Một cái gì đó tôi hiểu lầm về JNDI? Tất cả trợ giúp đều được đánh giá cao. Cảm ơn.

Trả lời

7

Nếu bạn đang sử dụng chú thích Khuôn mẫu mùa xuân, (@Service, @Component ...), thì có thể bạn đã bao gồm trong cấu hình mùa xuân của mình là yếu tố <context:component-scan /> để chọn chúng. Nó là tốt để làm điều này, nhưng nó sẽ tự động đăng ký CommonAnnotationBeanPostProcessor với bối cảnh ứng dụng, as stated just above the second note in this link.

Vấn đề với bao gồm CommonAnnotationBeanPostProcessor là Spring xử lý chú thích @Resource và sẽ cố gắng tiêm đậu từ ngữ cảnh ứng dụng của nó. Bạn có thể đăng ký bean CommonAnnotationBeanPostProcessor của riêng bạn và cho Spring biết để cho phép truy cập trực tiếp JNDI vào các cấu hình này bằng cách định cấu hình bean bằng cách đặt thuộc tính alwaysUseJndiLookup thành true.

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"> 
    <property name="alwaysUseJndiLookup" value="true"/> 
</bean> 

Chú ý đến các lưu ý trong tài liệu liên quan:

LƯU Ý: Một mặc định CommonAnnotationBeanPostProcessor sẽ được đăng ký bởi "bối cảnh: chú thích-config" và "bối cảnh: thành phần quét" thẻ XML . Xóa hoặc tắt cấu hình chú thích mặc định ở đó nếu bạn định chỉ định định nghĩa bean CommonAnnotationBeanPostProcessor tùy chỉnh!

+0

Tuyệt vời, điều này hoàn toàn hiệu quả! Tôi cũng phát hiện ra rằng bạn có thể buộc CommonAnnotationBeanPostProcessor thực hiện tra cứu JNDI bằng cách mở một giá trị cho "mappedName" trong phần chú thích. Tất cả những gì đã nói, và sau khi công việc được đưa vào điều này, tôi đã học được rằng quy trình triển khai công ty chuẩn của chúng tôi sẽ không hỗ trợ nhiều bộ mô tả triển khai. Tôi phải sử dụng cùng một trên tất cả các triển khai. Vì vậy, cách tiếp cận này sẽ không hoạt động. –

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