2015-06-12 15 views
8

Tôi có một ứng dụng Spring Boot (Y) mà dựa vào một bộ các tập tin thư viện đóng gói như x.jar và nhắc đến như một sự phụ thuộc trong pom.xml của Y. ứng dụngTôi có thể không @Autowire một Bean hiện diện trong Thư viện phụ thuộc không?

x.jar có một bean tên (User.java) Application Y có một lớp java tên (Department.java)

trong khi tôi cố gắng để Autowire một thể hiện của User.java bên Department.java, tôi nhận được lỗi sau

Can 't I @Autowire a Bean hiện diện trong Jar thư viện phụ thuộc?

không lĩnh vực autowire Could: dùng com.User tư nhân; ngoại lệ lồng nhau là org.springframework.beans.factory.NoSuchBeanDefinitionException: Không có loại đậu đủ điều kiện [com.User] được tìm thấy cho sự phụ thuộc: dự kiến ​​tại ít nhất 1 bean đủ điều kiện làm ứng cử viên tự động cho phụ thuộc này. Phụ thuộc chú thích: {@ org.springframework.beans.factory.annotation.Autowired (bắt buộc = true)}

Không đủ điều kiện đậu các loại [com.User] tìm thấy cho sự phụ thuộc: dự kiến ​​ ít nhất 1 đậu mà đủ điều kiện như autowire ứng cử viên cho sự phụ thuộc này . Phụ thuộc chú thích: {@ org.springframework.beans.factory.annotation.Autowired (bắt buộc = true)} **

Đây là đoạn mã vào mùa xuân Boot Application 'Y'

package myapp; 

@Component 
public class Department { 

    @Autowired 
    private com.User user; 

    //has getter setters for user 

} 

đây là mã của User.java trong Thư viện x.jar

package com; 

@Component 
@ConfigurationProperties(prefix = "test.userproperties") 
public class User { 

    private String name; 
    //has getter setters for name  
} 

đây là entry phụ thuộc cho x.jar trong pom.xml của ứng dụng Y

 <groupId>com.Lib</groupId> 
     <artifactId>x</artifactId> 
     <version>001</version> 
    </dependency> 

Đây là lớp học chính trong ứng dụng 'Y'

@Configuration 
@EnableAutoConfiguration 
@ComponentScan 
@EnableZuulProxy 
@EnableGemfireSession(maxInactiveIntervalInSeconds=60) 
@EnableCircuitBreaker 
@EnableHystrixDashboard 
@EnableDiscoveryClient 
public class ZuulApplication { 

    public static void main(String[] args) { 
     new SpringApplicationBuilder(ZuulApplication.class).web(true).run(args); 
    } 
} 

Cả hai Bộ Ngoại giao và người dùng được dưới các gói khác nhau.

Giải pháp: Tôi đã áp dụng 2 bước sau và giờ đây Autowiring đang hoạt động tốt.

Bước 1: Thêm lớp sau trong file jar

package com 
@Configuration 
@ComponentScan 
public class XConfiguration { 

} 

Bước 2: Nhập khẩu lớp Cấu hình này trong lớp học chính dự án của Y

@Configuration 
    @EnableAutoConfiguration 
    @ComponentScan 
    @EnableZuulProxy 
    @EnableGemfireSession(maxInactiveIntervalInSeconds=60) 
    @EnableCircuitBreaker 
    @EnableHystrixDashboard 
    @EnableDiscoveryClient 
    @Import(XConfiguration.class) 
    public class ZuulApplication { 

     public static void main(String[] args) { 
      new SpringApplicationBuilder(ZuulApplication.class).web(true).run(args); 
     } 
    } 
+2

Hiện bối cảnh ứng dụng của bạn xin vui lòng. – Jens

+1

Bạn có thể không có quét thành phần cho các gói của thư viện đó –

+0

chúng tôi đã không sử dụng XML ngữ cảnh ứng dụng, chỉ các chú thích. Ứng dụng Y là một ứng dụng khởi động mùa xuân. – yathirigan

Trả lời

7

Bạn sẽ cần phải thêm tên gói của lớp chính của bạn và lớp Người dùng chắc chắn là 100%, nhưng nhiều khả năng hơn, lớp Người dùng không nằm trong cùng một gói (hoặc gói con) của lớp chính của bạn. Điều này có nghĩa là quét thành phần sẽ không nhận được.

Bạn có thể buộc vào mùa xuân để nhìn vào gói khác như thế này:

@ComponentScan(basePackages = {"org.example.main", "package.of.user.class"}) 
+0

componentScan của bạn đề cập đến là lý do nhưng, tôi đã sử dụng một cách tiếp cận hơi khác nhau. đã cập nhật câu hỏi bằng giải pháp làm việc cuối cùng. cảm ơn bạn. – yathirigan

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