2010-11-09 38 views
14

Vì vậy, tôi phải nộp tính đơn giản với các mục sau:Chú thích Spring @Value luôn luôn đánh giá là rỗng?

my.value=123 
another.value=hello world 

tập tin thuộc tính này đã được nạp bằng một PropertyPlaceHolderConfigurer, mà tham chiếu nộp các thuộc tính trên.

Tôi có lớp sau đây, mà tôi đang cố gắng để tải các đặc tính này để như vậy:

public class Config 
{ 
    @Value("${my.value}") 
    private String mValue; 

    @Value("${another.value}") 
    private String mAnotherValue; 

    // More below... 
} 

Vấn đề là, mValuemAnotherValue là LUÔN null ... nhưng trong điều khiển của tôi , giá trị đang được tải tốt. Đưa cái gì?

+0

Lớp Cấu hình có được định nghĩa là bean mùa xuân không? – Raghuram

+0

không? Tôi sẽ làm như thế nào với chú thích? – Polaris878

+0

Tôi đã thử sử dụng "@Component" và "@Controller" trên lớp và không hoạt động – Polaris878

Trả lời

18

Nếu các trường hợp Config được khởi tạo thủ công qua new thì Spring sẽ không tham gia và do đó chú thích sẽ bị bỏ qua.

Nếu bạn không thể thay đổi mã của mình để Spring khởi tạo bean (có thể sử dụng hạt đậu prototype), thì tùy chọn khác là sử dụng chức năng dệt tải lớp thời gian của Spring (xem docs). Đây là một số AOP cấp thấp cho phép bạn tạo nhanh các đối tượng như bình thường, nhưng Spring sẽ chuyển chúng qua ngữ cảnh ứng dụng để có được chúng, được cấu hình, khởi tạo, v.v.

Nó không hoạt động trên tất cả nền tảng, tuy nhiên, vì vậy hãy đọc liên kết tài liệu ở trên để xem liệu nó có phù hợp với bạn hay không.

+0

Hey skaffman, cảm ơn lời khuyên ... Vấn đề là tôi đang instantiating 'Config' từ một JSP. Tôi không chắc liệu tôi có thể tìm được cách nào đó không? Có lẽ bằng cách sử dụng một số loại nhà máy? – Polaris878

+0

@ Polaris878: Đề xuất của tôi sẽ vẫn hoạt động đối với các đối tượng JSP-instantiated (bất kỳ đối tượng nào được khởi tạo qua phản chiếu) – skaffman

+0

+1. Tôi nắm bắt để biết về mùa xuân trong chi tiết đó. Không chạm vào nó trong nhiều năm. Nơi làm việc ngu ngốc. –

1

Khi làm việc với @Controller, có vẻ như bạn đang tự mình lập tức Config chính mình. Hãy để cho Spring khởi tạo nó.

+0

Ahhh yeah đó là vấn đề ... Tôi đang gọi cho nhà xây dựng bản thân mình. Làm thế nào sau đó, tôi có thể truy cập các thuộc tính này? Nếu tôi không thể truy cập vào các thuộc tính này, về cơ bản có nghĩa là tôi cần tìm một số cách khác để tải cấu hình, vì trình tải thuộc tính Spring sẽ không cắt nó nếu các thuộc tính đó chỉ có sẵn trong các trường hợp nhất định. – Polaris878

+0

@ Polaris878: Hãy để mùa xuân khởi tạo nó. Chúng ta có vấn đề gì với điều đó không? Hoặc tự mình làm bằng cách sử dụng 'ResourceBundle'. –

2

Thêm <context:spring-configured /> vào tệp ngữ cảnh ứng dụng của bạn.

Sau đó, thêm chú thích @Configurable vào Config lớp.

13

Tôi có các sự cố tương tự nhưng là một người mới tham gia Spring. Tôi đã cố gắng để tải các thuộc tính thành một @Service, và cố gắng sử dụng @value để lấy giá trị tài sản với ...

@Autowired 
public @Value("#{myProperties['myValue']}") String myValue; 

Tôi dành cả ngày cố gắng kết hợp khác nhau của các chú thích, nhưng nó luôn được trả về rỗng . Cuối cùng câu trả lời là luôn luôn rõ ràng sau khi thực tế.

1) chắc chắn rằng mùa xuân đang quét lớp học của bạn cho các chú thích bằng cách bao gồm các gói hệ thống phân cấp Trong servlet.xml của bạn (nó sẽ quét tất cả mọi thứ ở dưới giá trị cơ sở bạn chèn.

2) Hãy chắc chắn rằng bạn KHÔNG 'mới' lớp mà bạn vừa nói với Spring để xem xét. Thay vào đó, bạn sử dụng @Autowire trong lớp @Controller.

Mọi thứ trong Spring là Singleton, và những gì đã xảy ra là Spring tải giá trị vào Singleton của nó, sau đó tôi đã 'new'ed một thể hiện khác của lớp không chứa các giá trị mới nạp nên nó luôn luôn rỗng.

Thay vì sử dụng @Controller ...

@Autowired 
private MyService service; 

Debugging ... Một điều tôi đã làm để tìm thấy điều này là để mở rộng dịch vụ của tôi như sau ...

@Service 
public class MyService implements InitializingBean 

Sau đó đưa vào báo cáo debug trong ...

@Override 
public void afterPropertiesSet() throws Exception { 
// TODO Auto-generated method stub 
LOGGER.debug("property myValue:" + myValue);   
} 

Ở đây tôi có thể thấy giá trị được thiết lập khi khởi tạo, và sau đó khi tôi in nó theo một phương thức, nó là một đầu mối tốt cho tôi rằng nó không phải là cùng một ví dụ. Một đầu mối khác cho lỗi này là Tomcat đã phàn nàn về Timeout đang cố gắng đọc từ Socket với Không thể phân tích cú pháp HTTPheader ... Điều này là do Spring đã tạo ra một thể hiện của dịch vụ và vì vậy tôi đã có, do đó, một trong những của tôi đã làm công việc thực sự, và mùa xuân là thời gian ra trên ví dụ của nó.

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