2017-04-27 9 views
4

Ich habe einen Spring Boot, wo ich eine Router Bean automatisch konfiguriert habe. Das alles funktioniert perfekt, aber es wird zu einem Problem, wenn ich die Bohne in ein benutzerdefiniertes Servlet injizieren wollen:Spring Boot: Injection Bean in HttpServlet

public class MembraneServlet extends HttpServlet { 
    @Autowired 
    private Router router; 

    @Override 
    public void init() throws ServletException { 
     SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); 
    } 

    @Override 
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     new HttpServletHandler(req, resp, router.getTransport()).run(); 
    } 
} 

Dies ist der Weg zu gehen sein sollte, aber

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); 

wird das nicht autowire Router, weil WebapplicationContext immer Null ist. Die Anwendung wird in einer MVC-Umgebung ausgeführt.

+0

Ist Ihr httpservlet von Spring bo eingebettet ot? –

+0

Ist das nicht ein Duplikat von https://stackoverflow.com/questions/18745770/spring-injection-into-servlet? –

+1

Haben Sie erwogen, '@ Controller' oder' @ RestController' anstelle eines Servlets zu verwenden? Ich denke, es ist eine bessere Möglichkeit, Dinge im Frühjahr-Boot zu tun –

Antwort

3

Sie Frühlings-Anwendungskontext Unter der Annahme zum Servletkontext verdrahtet ist, möchten Sie vielleicht pass ServletContext zu SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext

public class MembraneServlet extends HttpServlet { 

    @Autowired 
    private Router router; 

    @Override 
    public void init() throws ServletException { 
     SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this, getServletContext()); 
    } 

    @Override 
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     new HttpServletHandler(req, resp, router.getTransport()).run(); 
    } 
} 
1

Was ist mit "Router" als Konstruktor Parameter injizieren.

So würden Sie dieses:

public class MembraneServlet extends HttpServlet { 

    private Router router; 

    public MembraneServlet(Router router){ 
     this.router = router; 
    } 

    @Override 
    public void init() throws ServletException { 
     SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); 
    } 

    @Override 
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     new HttpServletHandler(req, resp, router.getTransport()).run(); 
    } 
} 

dann können Sie programmatisch Servlet-Registrierung wie folgt erstellen:

@Bean 
public ServletRegistrationBean membraneServletRegistrationBean(){ 
    return new ServletRegistrationBean(new MembraneServlet(),"/*"); 
} 
+0

Das wird nicht funktionieren, weil das HttpServlet nicht von Spring instanziiert wird. – helpermethod

+0

Entschuldigung, ich habe den OP-Code kopiert und nicht den 'SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext (this); 'entfernt, der nicht notwendig ist, wenn nur die' Router'-Bean benötigt wird. – bilak

Verwandte Themen