2013-02-24 28 views
5

Tôi đã xem xét một số hướng dẫn để bắt đầu với Spring Framework và đi qua this one. Sau khi theo dõi nó, tôi chạy vào các lỗi dưới đây. (Tôi đã kể từ khi cập nhật để sử dụng phiên bản 3 của khuôn khổ mùa xuân và tôi vẫn nhận được các lỗi tương tự.Spring 3 @Autowired Annotation Issues

Nói tóm lại, tôi nhận được một NullPointerException nơi tôi gọi một phương thức trên một lớp AutoWired.

Lớp của tôi là SayHello:.

public class SayHello { 

private String name; 

public void setName(String name) { 
    this.name = name; 
} 

public String getName() { 
    return name; 
} 

public void greet() { 
    System.out.println("Hello " + getName()); 
} 

} 

sau đó tôi đặt sau trong /src/test/resources/applicationContext.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"> 

<context:annotation-config/> 


    <bean id="hello" class="package.SayHello"> 
    <property name="name" value="John Smith" /> 
    </bean 

Và cuối cùng tôi có lớp AppTest nơi tôi cố gắng AutoWire đối tượng SayHello để kiểm tra.

public class AppTest { 

@Autowired 
private SayHello hello; 

@Test 
public void testApp() 
{ 
    hello.greet(); 
    Assert.assertTrue(true); 
} 
} 

Khi tôi cố gắng chạy AppTest tôi nhận được lỗi sau:

java.lang.NullPointerException 
at package.AppTest.testApp(AppTest.java:19) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:601) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

Tôi đã xem các bài viết khác nhau và các câu hỏi trên stackoverflow nhưng sau khi thử một ít và không nhận được bất cứ nơi nào, suy nghĩ Tôi sẽ tạo một bài đăng mới.

Chúc mừng.

Nếu nó giúp, heres sự phụ thuộc mà tôi đang sử dụng (Spring v3.2.1):

<dependencies> 

<!-- JUnit --> 
<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.11</version> 
    <scope>test</scope> 
</dependency> 


<!-- Spring --> 
<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-beans</artifactId> 
    <version>${org.springframework.version}</version> 
</dependency> 

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-core</artifactId> 
    <version>${org.springframework.version}</version> 
</dependency> 

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-webmvc</artifactId> 
    <version>${org.springframework.version}</version> 
</dependency> 

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-context-support</artifactId> 
    <version>${org.springframework.version}</version> 
</dependency> 

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-aop</artifactId> 
    <version>${org.springframework.version}</version> 
</dependency> 

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-jms</artifactId> 
    <version>${org.springframework.version}</version> 
</dependency> 

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-context</artifactId> 
    <version>${org.springframework.version}</version> 
</dependency> 

Cập nhật

Tôi cũng đã thử bằng cách sử dụng @Autowired chú thích trong ứng dụng chính như sau. Và vẫn nhận được một lỗi NullPointerException.

public class App 
{ 
    @Autowired 
    private static SayHello hello; 

    public static void main(String[] args) 
    { 
     hello.greet(); 
    } 
} 

Trả lời

6

Bạn sẽ cần một số chú thích trên AppTest:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:/applicationContext.xml") 

Những chú thích này được định nghĩa trong mùa xuân-test, vì vậy thêm sự phụ thuộc này cũng như:

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-test</artifactId> 
    <version>${org.springframework.version}</version> 
    <scope>test</scope> 
</dependency> 
+0

Rực rỡ, điều đó đã làm được! Bài kiểm tra của tôi hiện đang chuyển và in ra như tôi mong đợi.Tôi có phải làm một cái gì đó tương tự để có được autowiring làm việc với các ứng dụng chính? Cảm ơn @zagyi! – cast01

+0

Không, nếu bạn sử dụng lớp 'App' như được định nghĩa trong bài viết bạn đã liên kết, nó sẽ xử lý chú thích theo hướng dẫn bởi dòng' 'trong cấu hình xml. – zagyi

+0

Chúc mừng @zagyi, tôi đã không chắc chắn nếu có một cách tôi có thể làm điều đó mà không cần phải nhanh chóng BeanFactory và sử dụng một cách rõ ràng getBean(), id thích sử dụng chú thích autowired. – cast01

3

Chú thích @Autowired sẽ chỉ hoạt động nếu bản thân AppTest được quản lý bởi Spring. Có vẻ như bạn đang thử nghiệm thiết lập của mình trong một bài kiểm tra đơn vị đơn giản. Điều này sẽ không hoạt động. Nếu bạn muốn autowiring trong các bài kiểm tra JUnit, bạn sẽ phải xem xét hỗ trợ Testing của Spring. Nhưng đó là một chủ đề hoàn toàn khác.

+0

cảm ơn @chkal, tôi cũng đã thử Autowired trong ứng dụng chính và vẫn nhận được lỗi tương tự, bị lỗi cập nhật câu hỏi để hiển thị điều đó. – cast01

1

Trong hướng dẫn bạn đã liên kết mã này instantiates đậu:

BeanFactory factory = new XmlBeanFactory(
    new ClassPathResource("application-context.xml")); 

SayHello hello = (SayHello) factory.getBean("hello"); 

SayHello đậu của bạn là null.

+0

Cảm ơn @Aubin, tôi đã đi qua nhiều ví dụ mà chỉ dựa vào applicationContext.xml để xử lý các bean. Tôi tin rằng hướng dẫn sử dụng phương pháp đó vì nó sử dụng Spring 2. – cast01

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