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