2012-12-17 46 views
51

tôi đã xác định một bản đồ trong mùa xuân như vậy:mùa xuân không thể autowire Bản đồ đậu

<util:map id="AdditionalParams" scope="prototype" map-class="java.util.HashMap" 
      key-type="java.lang.String" value-type="java.lang.String"> 

    <entry key="Start" value="12345" /> 
    <entry key="Finish" value="12365" /> 
</util:map> 

Và sau đó tôi autowiring đậu này để một tài sản được xác định như sau:

private @Autowired @Qualifier(value = "AdditionalParams") Map<String, String> additionalParams; 

Khi làm điều này, một ngoại lệ được ném ném nói rằng:

gây ra bởi: org.springframework.beans.factory.BeanCreationException: Lỗi tạo bean có tên 'DutyCreator': Inje ction phụ thuộc autowired thất bại; ngoại lệ lồng nhau là org.springframework.beans.factory.BeanCreationException: Không thể autowire trường: private java.util.Map DutyCreator.additionalParams; ngoại lệ lồng nhau là org.springframework.beans.factory.NoSuchBeanDefinitionException: Không có bean phù hợp với loại [java.lang.String] được tìm thấy cho sự phụ thuộc [map với kiểu giá trị java.lang.String]: dự kiến ​​có ít nhất 1 bean đủ điều kiện làm ứng cử viên autowire cho sự phụ thuộc này. Chú thích phụ thuộc: {@ org.springframework.beans.factory.annotation.Autowired (required = true), @ org.springframework.beans.factory.annotation.Qualifier (value = AdditionalParams)}

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

Bất kỳ ý tưởng?

Chúc mừng.

+0

Xin hãy chia sẻ tập tin bối cảnh ứng dụng của bạn. – Amber

+0

Bạn cũng có thể sử dụng cấu hình '' xml – Alex

Trả lời

108

Bắt đầu với mùa xuân 4.3, @Autowiredcan inject lists and maps và mã đưa ra trong câu hỏi sẽ làm việc:

Điều đó nói rằng, tính đến 4.3, bộ sưu tập/đồ và các loại mảng có thể được xuất hiện qua @Autowired loại phù hợp với thuật toán Spring như tốt, miễn là thông tin loại phần tử được giữ nguyên trong @Bean chữ ký kiểu trả về hoặc phân cấp thừa kế bộ sưu tập.

Nhưng với phiên bản Spring thấp hơn, bạn không thể tự động thu một bộ sưu tập như thế. Tuy nhiên, bạn có thể làm như sau:

@Resource(name="AdditionalParams") 
private Map<String, String> additionalParams; 

hoặc thậm chí:

@Value("#{AdditionalParams}") 
private Map<String, String> additionalParams; 

Kiểm tra spring docs, những lời khuyên phần:

đậu được tự định nghĩa là một bộ sưu tập hoặc bản đồ kiểu không thể được tiêm qua @Autowired, vì đối sánh loại không đúng cách áp dụng cho chúng. Sử dụng @Resource cho đậu như

+1

hoàn hảo. chính xác những gì tôi đang tìm kiếm .. Cảm ơn. điều này làm việc cho tôi .. @Resource (name = "AdditionalParams") –

+0

Cảm ơn, điều này rất không trực quan; Bây giờ tôi biết thêm về 'map' và' util: map' hơn tôi muốn: -/ –

+0

Wow, tôi đã dành hàng giờ cho vấn đề này. Tại sao mùa xuân chỉ sử dụng autowire thay vì tài nguyên? Cách này chỉ làm cho Spring trở nên khó chịu khi sử dụng. –

2

Có vẻ như @Qualifier (value = "AdditionalParams") của bạn không được làm việc.

Hãy thử sử dụng bản đồ bằng cách chú thích sau:

@Resource 
private Properties AdditionalParams; 

và giữ tập tin applicationContext.xml của bạn còn nguyên vẹn.

1
@Autowired ApplicationContext ctx; 
private <T> T getBean(String qualifier, Class<T> returnType){ 
    //use this for loop to print all bean from ctx. so you wont miss the typo. 
    /*for(String s:ctx.getBeanDefinitionNames()) 
     log.info(s);*/ 
    return ctx.getBean(qualifier, returnType); 
} 

// bên trong cuộc gọi của bạn

if(providerList == null){ 
     providerList = ctx.getBean("providerList", Map.class); 
} 

Giải pháp này hoạt động tốt với tôi

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