2017-01-21 3 views
-1

ProjektstrukturFrühling Hallo Dependency Injection @Autowired wirft Nullpointer

enter image description here

TestController.java

package com.mypack; 

import java.io.IOException; 
import java.io.PrintWriter; 

import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 

/** 
* Servlet implementation class Test 
*/ 
@WebServlet("/test") 
@Controller 
public class TestController extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    @Autowired 
    private TestManager testManager; 


    public TestManager getTestManager() { 
     return testManager; 
    } 

    public void setTestManager(TestManager testManager) { 
     this.testManager = testManager; 
    } 

    public TestController() { 
     super(); 
    } 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.getWriter().append("Served at: ").append(request.getContextPath()); 

     String name=testManager.getName(); 
     PrintWriter pw=response.getWriter(); 
     pw.write(name); 
    } 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     doGet(request, response); 
    } 

} 

TestManager.java

package com.mypack; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Configurable; 
import org.springframework.stereotype.Service; 

@Service("testManager") 
public class TestManager { 

    @Autowired 
    private TestDao testDao; 

    public String getName(){ 
     return testDao.getName(); 
    } 

    public TestDao getTestDao() { 
     return testDao; 
    } 

    public void setTestDao(TestDao testDao) { 
     this.testDao = testDao; 
    } 
} 

TestDao.java

package com.mypack; 

import org.springframework.stereotype.Repository; 

@Repository("testDao") 
public class TestDao { 
    public String getName(){ 
     return "Randhir"; 
    } 
} 

spring.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-2.5.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 

    <!-- Enable Spring Application Context --> 
    <context:spring-configured /> 

    <!-- Scan class file in class path for annotated component -> @Component, @Repository, @Service, and @Controller --> 
    <context:component-scan base-package="com.mypack" /> 

</beans> 

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 
    <display-name>SpringIOCWeb</display-name> 
    <welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 

    <listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/spring.xml 
    </param-value> 
</context-param> 

</web-app> 

Server Console

INFO: 1 Spring WebApplicationInitializers detected on classpath 
Jan 21, 2017 7:50:39 PM org.apache.catalina.core.ApplicationContext log 
INFO: Initializing Spring root WebApplicationContext 
Jan 21, 2017 7:50:39 PM org.springframework.web.context.ContextLoader initWebApplicationContext 
INFO: Root WebApplicationContext: initialization started 
Jan 21, 2017 7:50:39 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh 
INFO: Refreshing Root WebApplicationContext: startup date [Sat Jan 21 19:50:39 IST 2017]; root of context hierarchy 
Jan 21, 2017 7:50:39 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from ServletContext resource [/WEB-INF/spring.xml] 
Jan 21, 2017 7:50:40 PM org.springframework.web.context.ContextLoader initWebApplicationContext 
INFO: Root WebApplicationContext: initialization completed in 731 ms 
Jan 21, 2017 7:50:40 PM org.apache.coyote.AbstractProtocol start 
INFO: Starting ProtocolHandler ["http-nio-8090"] 
Jan 21, 2017 7:50:40 PM org.apache.coyote.AbstractProtocol start 
INFO: Starting ProtocolHandler ["ajp-nio-8009"] 
Jan 21, 2017 7:50:40 PM org.apache.catalina.startup.Catalina start 
INFO: Server startup in 2836 ms 
Jan 21, 2017 7:50:45 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [com.mypack.TestController] in context with path [] threw exception 
java.lang.NullPointerException 
    at com.mypack.TestController.doGet(TestController.java:43) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:618) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658) 
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:724) 

IOC Container wird die Bean instanziiert und die Objektreferenz unter Verwendung setter Verfahren zuordnen. Ist mein Konzept richtig?

Aber hier @Autowired nicht die Objektreferenz zuweisen. Bis ich die Hauptmethode mit ApplicationContext und getBean verwendet habe, um Spring zu lernen.

Aber wie funktioniert die Bean-Konfiguration mit Servlet?

+1

Sie ein hinzufügen müssen autowire könnte Kommentar zu jeder in einer Stack-Trace genannten Quellcodezeile, damit wir wissen, welche Zeile welche ist. –

+0

Sobald @Autowired Annotation verwendet wird, brauchen Sie keine Setter-Methoden, um Abhängigkeiten zu injizieren. – asg

+1

Ein Spring '@ Controller' ist * kein * Servlet (' @ WebServlet'/'HttpServlet'). Die Annotation '@ WebServlet' bedeutet, dass das' HttpServlet' direkt vom Servlet Container (Tomcat, Jetty, ...) geladen wird, wobei der Spring Container umgangen wird, was bedeutet, dass '@ Autowired' nicht angewendet wird. Das wird durch den StackTrace bestätigt, da es keine Spring-Klassen im Stack gibt. Sie sollten das Handbuch [Spring Web MVC] (https://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html) erneut lesen, damit Sie wissen, was ein Controller ist, und wie man einen schreibt. – Andreas

Antwort

2

Ihre testManager ist null. Sie mischen Servlet- und Spring-Controller.

Sie sollten Feder Dispatcher Servlet verwenden:

<servlet> 
    <servlet-name>mvc-dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>mvc-dispatcher</servlet-name> 
    <url-pattern>/spring/*</url-pattern> 
</servlet-mapping> 

Die DispatcherServlet ist eine einzigartige Servlet, wie ein Front-Controller (in einem MVC2-Muster), das die Anforderung Controller zum Frühling entsendet (eine Federkomponente).

Entfernen Sie in Ihrem Controller TestController die Vererbung von HttpServlet und überschreiben Sie Methoden (doGet, doPost ..), und verwenden Sie @RequestMapping.

Auf diese Weise werden Sie die Abhängigkeitsinjektion von Spring-Framework verwenden.

@Controller 
@RequestMapping("/test") 
public class TestController { 

    @Autowired 
    private TestManager testManager; 

    @RequestMapping 
    @ResponseBody 
    public String handleRequest(final HttpServletRequest request, final HttpServletResponse response) { 
     String name=testManager.getName(); 
     return name; 
    } 

} 
0

Da Sie Servlets verwenden und nicht die Steuerung Sie es mit dem Code

@WebServlet("/test") 
public class TestController extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    private AutowireCapableBeanFactory ctx; 

    @Autowired 
    private TestManager testManager; 

    @Override 
    public void init() throws ServletException { 
     super.init(); 

     WebApplicationContext context = WebApplicationContextUtils 
       .getWebApplicationContext(getServletContext()); 
     ctx = context.getAutowireCapableBeanFactory(); 
     ctx.autowireBean(this); 
    } 
    ... 
} 

Sie bereits integriert haben Frühling mit seinem eigenen Kontext Zuhörer

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener>