2016-07-06 14 views
-1

So bin ich beschäftigt, eine Spring Boot App zu schreiben, aber ich kann nicht herausfinden, wie ich ein Objekt an meine RestController von meiner Hauptanwendung übergeben kann.Spring: Übergeben Sie Objekt an RestController von Anwendung

Hier ist meine Application.java:

@SpringBootApplication 
@ComponentScan("webservices") 
public class Application { 


    public static void main(String[] args) { 
     ApplicationContext ctx = SpringApplication.run(Application.class, args); 
     Application app = new Application(ctx); 
     LinkedBlockingQueue<RawDate> queue = new LinkedBlockingQueue<>(); 
     // do other stuff here 
    } 
} 

Und hier ist mein RestController:

@RestController 
public class GoogleTokenController { 
    private LinkedBlockingQueue<RawData> queue; 

    @CrossOrigin 
    @RequestMapping(value = "/google/token", method = RequestMethod.POST, headers = {"Content-type=application/json"}) 
    @ResponseBody  
    public String googleToken(@RequestBody AuthCode authCode) { 
     System.out.println("CODE: " + authCode.getAuthCode()); 
     // do other stuff here 
     return "OK"; 
    } 
} 

Deshalb möchte ich die gleiche Instanz von LinkedBlockingQueue<RawData> zu übergeben, die in der Application Klasse die erstellt wird, GoogleTokenController Klasse. Aber ich habe keine Ahnung, wie das zu tun ist, da der Frühling automatisch die Klasse GoogleTokenController erstellt.

Bitte beachten Sie, ich bin sehr neu in Frühling. Vielen Dank.

Antwort

2

Machen Sie das Objekt, dem Sie eine Spring-Bean übergeben möchten, und lassen Sie Spring es in den Controller injizieren. Zum Beispiel:

@SpringBootApplication 
@ComponentScan("webservices") 
public class Application { 

    @Bean 
    public LinkedBlockingQueue<RawDate> queue() { 
     return new LinkedBlockingQueue<>(); 
    } 

    public static void main(String[] args) { 
     ApplicationContext ctx = SpringApplication.run(Application.class, args); 
     Application app = new Application(ctx); 
     // do other stuff here 
    } 
} 

@RestController 
public class GoogleTokenController { 
    @Autowired // Let Spring inject the queue 
    private LinkedBlockingQueue<RawData> queue; 

    @CrossOrigin 
    @RequestMapping(value = "/google/token", method = RequestMethod.POST, headers = {"Content-type=application/json"}) 
    @ResponseBody  
    public String googleToken(@RequestBody AuthCode authCode) { 
     System.out.println("CODE: " + authCode.getAuthCode()); 
     // do other stuff here 
     return "OK"; 
    } 
} 

In anderen Orten, an denen Sie den Zugriff auf queue benötigen, lassen Sie auch Frühling es injiziert.

+0

Hallo danke für die Antwort, aber die Warteschlange Variable in GoogleTokenController ist null, wenn ich dies tun. –

+0

@ArmandMaree Erstellen Sie den 'GoogletokenController' selbst mit' newGoogleTokenController() '? Tun Sie das nicht (das ist der # 1 Fehler, den Leute mit Spring Dependency Injection machen) - lassen Sie Spring den 'GoogletokenController' erstellen. – Jesper

+0

Nein Ich erstelle den GoogleTokenController nicht. Der Frühling macht es alleine. –

0

Wie wäre es mit der Erstellung einer Komponente, die Sie in Ihren Controller injizieren können? Sie könnten eine separate Klasse für die Queue als

@Component 
public class RawDateQueue extends LinkedBlockingQueue<RawDate> { 
    // no further implementations 
} 

und verwenden RawDateQueue in dem Controller erstellen.

0

Verwendung -:

@autowired 
    private LinkedBlockingQueue<RawData> queue; 

    OR 

    @inject 
    private LinkedBlockingQueue<RawData> queue; 
+1

Bitte fügen Sie eine Erklärung zu Ihrer Antwort hinzu. Code-only-Antworten werden von SO abgeraten. Vielen Dank. –

Verwandte Themen