2013-05-20 40 views
5

Tôi có mã @Inject hoạt động trong một lớp nhưng không hoạt động ở một lớp khác. Dưới đây là mã của tôi:Chú thích mùa xuân @Inject không hoạt động

  • context.xml
<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 

     xsi:schemaLocation=" http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd 
        "> 
    <bean id="multipartResolver" 
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean> 
    <context:component-scan base-package="com.myfashions.services"/> 
    <context:component-scan base-package="com.myfashions.dao"/> 
</beans> 
  • SellerRetriever.java
public class SellerRetriever { 
    @Inject 
    UserDAO userDAO; 
    ... 
    ... 
} 

UserDAO lớp hiện diện trong com.myfashions.dao gói. @Inject không hoạt động trong Seller.java. Có lý do gì không?

+1

Lớp học Người bán có được quản lý không? Hay bạn đang tạo nó với toán tử 'new'? –

+1

Cảm ơn @ nicholas.hauschild u khiến tôi biết sai lầm của mình. Tôi đã tạo đối tượng đó với toán tử mới. Vì vậy, đó là lý do tôi nhận được tất cả các tiêm null – vicky

+0

'@ Inject' không phải là một chú thích mùa xuân – ACV

Trả lời

2

tôi thấy sai lầm của tôi, tôi gửi bài này vì trong trường hợp có ai có cùng một vấn đề. Tôi đã sử dụng toán tử mới để tạo đối tượng SellerRetriver. Tiêm sẽ không hoạt động nếu nhà điều hành mới được sử dụng để gọi đó là lớp học cụ thể.

3

Để đủ điều kiện để quét, lớp học của bạn phải được chú thích với hoặc là một chung chung hơn @Component, hoặc @Service hoặc @Repositories vv .. Trong trường hợp của bạn, @Service phù hợp một cách hợp lý hơn. Sau đó bạn có thể (nếu bạn cần) xác định một số khía cạnh (AOP) tập trung cụ thể vào các cuộc gọi dịch vụ.

Bên cạnh đó, bạn có thể muốn sử dụng @Autowired thay vì @Inject để truy xuất bean của mình.

Để biết thêm thông tin về sự khác biệt liên quan đến hai chú thích sau đây:

What is the difference between @Inject and @Autowired in Spring Framework? Which one to use under what condition?

và bạn có thể thấy nhận xét của tôi ngay dưới giải thích một lý do chính đáng để giữ @Autowired thay vì @Inject.

+0

Đó là một câu trả lời tuyệt vời, nhưng tôi vẫn nhận được NullPointerException. – vicky

+0

Tôi nghĩ bạn có thể sử dụng '@ Inject' hoặc' @ Autowired' kết hợp với 'component-scan' ... miễn là bạn đang sử dụng Spring 3. – Jonathan

+0

thêm @Component hoặc @ Service hoặc @ Repositories lên lớp của bạn tuyên bố, nếu không nó sẽ không được quét. – Mik378

7

Đảm bảo rằng cả hai SellerRetriever và việc triển khai UserDAO đều được chú thích cho quá trình quét thành phần. Điều này sẽ đảm bảo rằng sau này được tiêm vào các cựu:

@Service 
public class SellerRetriever { 
    @Inject 
    UserDAO userDAO; 
    ... 
} 

Chú thích việc thực hiện UserDAO với @Component.

Khi quét nhiều đường sử dụng:

<context:component-scan base-package="com.myfashions.services, com.myfashions.dao"/> 
+1

UserDAO đang được tiêm vào các lớp dịch vụ khác nhưng không phải trong SellerRetriever.java – vicky

+1

Tôi giả định rằng 'SellerRetriever' trong' com.myfashions.services'. Thử sử dụng thẻ quét thành phần trong ngữ cảnh ứng dụng của bạn – Reimeus

+0

@Reimeus Đó là một gợi ý thú vị. Spring có thể thực hiện quét thành phần đầu tiên và bỏ lỡ 'UserDAO' bởi vì nó không đi xung quanh nó cho đến khi quét thành phần thứ hai? – davidfmatheson

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