2012-12-19 24 views
25

tôi có thể làm điều này trong applicationContext của tôi với mùa xuân (3.0.5):thể tạo HashMap với mùa xuân nhưng không thể tạo Bản đồ

<bean id="map" class="java.util.HashMap" scope="prototype" > 
    <constructor-arg> 
     <map key-type="java.lang.String" value-type="java.lang.String"> 
      <entry key="Key 1" value="1" /> 
      <entry key="Key 2" value="2" /> 
     </map> 
    </constructor-arg> 
</bean> 

Và trong điều khiển của tôi, tôi có thể autowired bản đồ của tôi như thế này:

@Autowired 
@Qualifier("map") 
private HashMap<String, String> map; 

Nó hoạt động tốt, nhưng nếu tôi làm điều này:

@Autowired 
@Qualifier("map") 
private Map<String, String> map; 

tôi nhận được rằng:

Nguyên nhân: org.springframework.beans.factory.NoSuchBeanDefinitionException: Không phù hợp với đậu các loại [java.lang.String] tìm thấy cho sự phụ thuộc [bản đồ với kiểu giá trị java.lang.String]: dự kiến ​​tại ít nhất 1 đậu mà đủ điều kiện làm ứng viên autowire cho sự phụ thuộc này. Phụ thuộc chú thích: {@ org.springframework.beans.factory.annotation.Autowired (bắt buộc = true), @ org.springframework.beans.factory.annotation.Qualifier (value = bản đồ)}

My câu hỏi là: Tại sao tôi không thể tự động bản đồ của mình với giao diện khi tôi có thể thực hiện?

Cảm ơn.

+1

không có một id đậu của bản đồ, đó là khó hiểu – NimChimpsky

+1

vấn đề thực sự là: bản đồ không phải là một mùa xuân đậu ở tất cả các nơi đầu tiên. dịch vụ nên là đậu, dữ liệu không nên. Nếu bạn thực sự muốn có một bean bản đồ, hãy tạo một bean chứa một bản đồ và tiêm nó. –

+0

@SeanPatrickFloyd tại sao bạn không thể tiêm bất cứ thứ gì và nhận trợ cấp. Không có tác dụng tiêu cực nào? (giả sử bạn đặt tên mô tả) – NimChimpsky

Trả lời

35

Trong khi tuyên bố một bean thu loại, người ta không thể bơm nó thông qua @Autowired. Xem dưới đây tài liệu từ mùa xuân:

4.11.3 Fine-tuning annotation-based autowiring with qualifiers

Như một hệ quả cụ thể của sự khác biệt ngữ nghĩa này, đậu mà là tự định nghĩa là một tập hợp hoặc loại bản đồ không thể được tiêm qua @Autowired từ kiểu phù hợp không phải là áp dụng đúng cho họ. Sử dụng @Resource cho các loại đậu như vậy, đề cập đến bộ sưu tập/bản đồ cụ thể đậu theo tên duy nhất.

Như vậy thay vì @Autowired, sử dụng @Resource:

@Resource 
@Qualifier("map") 
private Map<String, String> map; 
+1

Nhưng tôi không thể sử dụng @Resource về tham số hàm tạo. Tôi cần điều này thông qua hàm tạo – Harish

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