2017-01-23 8 views
0

Ich möchte einen eingebetteten Tomcat-Server von einer Desktop-Anwendung aus starten. Die Webapp, die innerhalb des Tomcat-Containers läuft, wird über den WebApplicationInitializer von Spring konfiguriert (im Moment erweitere ich einfach AbstractAnnotationConfigDispatcherServletInitializer). Wie kann ich ein bereits existierendes Objekt von meiner Desktop-Anwendung an den von der Webanwendung verwendeten WebApplicationContext übergeben?Wie übergeben Sie ein vorhandenes Objekt an Spring WebApplicationContext?

Hier einiger Beispielcode, der es mehr klar, was hoffentlich macht ich zu erreichen versuchen:

public class MyWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class<?>[] { SpringAppConfig.class }; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return new Class<?>[] { SpringWebConfig.class }; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[] { "/" }; 
    } 
} 

@Configuration 
@EnableWebMvc 
public class SpringWebConfig extends WebMvcConfigurerAdapter { 
} 

//somewhere in my desktop application where I want to start the server... 
    MyObject myObj = new MyObject(SomeParameters params); 
    //I want to have myObj available for Spring managed objects, 
    //like @Components and @RestController etc. that get created by Spring 

    Tomcat tc = new Tomcat(); 
    //some tomcat configuration here 
    tc.start(); //automatically searches for WebApplicationInitializer in classpath 
    //I do not know how the Spring managed beans can be made aware of myObj. 

Antwort

1

Frühling Container sie alle ojekte verwalten können, wenn durch Feder Container initialisiert wird. Wenn Sie möchten, dass ein externes Objekt im Frühling zur Laufzeit injiziert wird, können Sie es nicht tun.

So kann jedes Objekt, das durch externe Kodierung erzeugt wird, nicht im Frühling verwaltet oder injiziert werden.

Hoffe das löscht Ihre Zweifel.

+0

ok so meinst du meine einzige option ist myObj über Spring zu erstellen, wenn ich es von anderen Spring verwaltete objekte verwenden möchte? – user1304680

+1

Ja genau. Sie müssen es über Spring erstellen – Ankit

0

Mit Jetty als eingebetteten Container konnte ich dies mit ServletContext Attribute tun. Indem ich die Attribute bei der Erstellung der WebAppContext übergebe, kann ich auf sie in meinen Beans zugreifen, indem ich sie ServletContextAware implementieren lasse.

So erstelle ich meine Jetty-Instanz und legen Sie es mit einem WebAppContext:

WebAppContext webapp = new WebAppContext(); 
webapp.setAttribute("org.apache.geode.securityService", getSecurityService()); 

Und dann einfach meine Bean implementiert ServletContextAware:

public class LoginHandlerInterceptor implements ServletContextAware { 
    ... 
    @Override 
    public void setServletContext(ServletContext servletContext) { 
    securityService = (SecurityService) servletContext.getAttribute("org.apache.geode.securityService"); 
    } 
} 

Ich bin sicher, dass es einen Weg geben muss Setzen Sie in Tomcat die Context-Attribute des Servlets (nicht die Servlet-Init-Parameter).

Verwandte Themen