2013-02-24 5 views
5

Ich habe mir einige Tutorials angesehen, um mit dem Spring Framework zu beginnen und bin auf this one gestoßen. Nachdem ich es durchgegangen bin, bin ich auf die folgenden Fehler gestoßen. (Ich habe aktualisiert seit Version 3 des Federrahmen zu verwenden, und ich bin immer noch die gleichen Fehler zu bekommen.Spring 3 @Autowired Annotation Issues

Kurz gesagt, ich bin ein Nullpointer bekommen, wo ich eine Methode einer AutoWired Klasse aufrufen.

meine Klasse SayHello ist.

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()); 
} 

} 

ich habe dann nach dem in /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 

Und schließlich habe ich die AppTest-Klasse, wo ich versuche, ein SayHello-Objekt zum Testen AutoWire.

public class AppTest { 

@Autowired 
private SayHello hello; 

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

Wenn ich versuche, AppTest zu laufen ich die folgende Fehlermeldung erhalten:

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) 

Ich habe einen Blick auf verschiedene Artikel hatte und Fragen auf Stackoverflow, aber nach ein paar und nicht überall versuchen immer, Gedanken Ich würde einen neuen Beitrag erstellen.

Prost.

Wenn es hilft, heres die Abhängigkeiten, die ich verwende (Frühling 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> 

aktualisieren

ich auch die @Autowired versucht haben, mit Annotation in der Hauptanmeldung wie folgt. Und immer noch eine NullPointerException-Fehler erhalten.

public class App 
{ 
    @Autowired 
    private static SayHello hello; 

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

Antwort

6

Sie werden einige Anmerkungen auf AppTest benötigen:

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

Diese Annotationen im Frühjahr Test definiert sind, so fügen Sie diese Abhängigkeit auch:

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

Brilliant, das war's! Mein Test wird jetzt wie erwartet weitergegeben und gedruckt.Muss ich etwas Ähnliches tun, um mit der Hauptanwendung arbeiten zu können? Danke @zagyi! – cast01

+0

Nein, wenn Sie die App-Klasse verwenden, die in dem von Ihnen verlinkten Artikel definiert ist, verarbeitet sie die Annotation wie in der Zeile "" in der XML-Konfiguration angegeben. – zagyi

+0

Cheers @zagyi, ich war mir nicht sicher, ob es einen Weg gab, den ich machen konnte, ohne die BeanFactory zu instanziieren und explizit getBean() zu verwenden, ID, die autowired Annotation zu verwenden. – cast01

3

Die @Autowired Anmerkung wird nur funktionieren, wenn AppTest selbst wird von Frühling. Es sieht so aus, als würden Sie Ihr Setup in einem einfachen Komponententest testen. Dies wird nicht funktionieren. Wenn Sie in JUnit-Tests automatisch starten möchten, müssen Sie sich die Testunterstützung von Spring ansehen. Aber das ist ein ganz anderes Thema.

+0

danke @chkal, ich habe auch versucht, in der Hauptanwendung Autowired und immer noch den gleichen Fehler, schlecht aktualisieren die Frage, um das zu zeigen. – cast01

1

Im Tutorial Sie diesen Code verknüpft haben instanziiert die Bohne:

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

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

Ihre SayHello Bohne ist Null.

+0

Dank @Aubin, ich bin auf viele Beispiele gestoßen, die nur auf die applicationContext.xml angewiesen sind, um die Beans zu behandeln. Ich glaube, dass das Tutorial diese Methode verwendet, wie es Spring 2 verwendet. – cast01