2016-04-25 15 views
1

Ich habe eine Ebene POJO im Frühjahr autowired, deren Eigenschaften scheinen zu bestehen.Spring Bean Eigenschaften persistent

Ich finde, dass der glückliche Weg ist in Ordnung - Set Bean-Eigenschaften und Rückkehr dann aber wenn ich nicht auf dem glücklichen Weg bin und ich nicht mehr eine Eigenschaft (in diesem Fall responseCode) festlegen möchte, finde ich es ist immer noch auf den vorherigen Wert gesetzt (wenn ein Anruf erfolgreich war).

Ich möchte diesen Wert nicht festgelegt werden und gleich sein, was ich derzeit im Modell angegeben habe.

Ich habe die folgende POJO Prototype bean

package com.uk.jacob.model; 

import org.springframework.context.annotation.Scope; 
import org.springframework.stereotype.Component; 

@Component 
@Scope("prototype") 
public class Website { 
    public String url; 
    public boolean response; 
    public int responseCode = 0; 
} 

Ich stelle es Informationen innerhalb einer Serviceklasse

package com.uk.jacob.service; 

import java.net.HttpURLConnection; 

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

import com.uk.jacob.adapter.HttpAdapter; 
import com.uk.jacob.model.Website; 

@Component 
public class PingerService { 

    @Autowired 
    HttpAdapter httpAdapter; 

    @Autowired 
    Website website; 

    public Website ping(String urlToPing) { 
     website.url = urlToPing; 

     try { 
      HttpURLConnection connection = httpAdapter.createHttpURLConnection(urlToPing); 

      website.response = true; 
      website.responseCode = connection.getResponseCode(); 
     } catch (Exception e) { 
      website.response = false; 
     } 

     return website; 
    } 
} 

, die von einem RestController

package com.uk.jacob.controller; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.RestController; 

import com.uk.jacob.model.Website; 
import com.uk.jacob.service.PingerService; 

@RestController 
@RequestMapping("api/v1/") 
public class PingController { 

    @Autowired 
    PingerService pingerService; 

    @RequestMapping(value = "ping", method = RequestMethod.GET) 
    public Website getPing(@RequestParam String url){ 
     return pingerService.ping(url); 
    } 

} 

Antwort

0

Die Tatsache genannt, dass Ihre Website Bean ist @Scope("prototype") bedeutet, dass jedes Mal th Wenn es bei der Erstellung dieser Bean als Abhängigkeit in eine andere Bean injiziert wird, wird eine neue Instanz erstellt und injiziert. In diesem Fall erhält PingerService eine neue Instanz von Website. Wenn beispielsweise Website in eine andere Bean namens Website2 injiziert wird, wird eine andere (neue) Instanz injiziert.

Wenn Ihre Erwartung Website ist, um bei jedem Aufruf innerhalb Website neu zu sein, dann kann dies nicht einfach mit der Prototyp-Annotation erfolgen. Sie müssen den Kontext verfügbar machen und ApplicationContext#getBean("website") aufrufen.

+0

Können Sie mehr über 'ApplicationContext # getBean (" Website ") erklären?', Was ist das? Was ist das Problem in meinem Code? –

0

Für Ihren Anwendungsfall verstehe ich, dass Sie für jede Anfrage eine neue Instanz der Bean Website benötigen.

Verwenden Sie @Scope ("Anfrage").

Prototype Bereich bedeutet auf der anderen Seite, dass es eine separate Instanz für jeden Autowiring der Website schaffen wird, die es überall sieht. PingerService wird beispielsweise eine eigene Website-Bean haben und wird nicht für andere Klassen mit demselben Autowiring freigegeben, aber seine Werte bleiben bei HTTP-Anfragen auf PingerService bestehen.