2011-01-07 9 views
-1

Ich habe folgende Anforderung Ich wollte http:\\localhost:9080\testws.cls Wert als Setter-Injektion durch Feder Konfigurationsdatei übergeben. Wie kann ich für diese statische Variable Setter Injektion tun TEST1_WSDL_LOCATIONstatische Setter-Methode Injektion im Frühjahr

public class test1 
    extends javax.xml.ws.Service 
{ 

    private final static URL TEST1_WSDL_LOCATION; 

    static { 
     URL url = null; 
     try { 
      url = new URL("http:\\localhost:9080\testws.cls"); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 
     TEST1_WSDL_LOCATION = url; 
    } 

    public test1(URL wsdlLocation, QName serviceName) { 
     super(wsdlLocation, serviceName); 
    } 

    public test1() { 
     super(TEST1_WSDL_LOCATION, new QName("http://tempuri.org", "test1")); 
    } 

    /** 
    * 
    * @return 
    *  returns test1Soap 
    */ 
    @WebEndpoint(name = "test1Soap") 
    public Code1Soap getTest1Soap() { 
     return (Test1Soap)super.getPort(new QName("http://tempuri.org", "Test1Soap"), Test1Soap.class); 
    } 

} 

Bitte helfen Sie mir.

+2

Was ist der Sinn machen es statisch ist? Machen Sie einfach eine Instanzvariable eines Objekts mit Singleton-Bereich und injizieren Sie es auf die übliche Weise. –

+0

Arbeitslösung ist bereits in einem anderen Beitrag diskutiert: http://stackoverflow.com/questions/2763279/injecting-values-for-static-constants-in-spring. Überprüfen Sie auch http://www.connorgarvey.com/blog/?p=105. Arbeitete für mich. – spujap

Antwort

1

Sie können einen Setter für eine Bean-Instanz tun.

Class WsdlCode{ 
private static URL WSDL_LOCATION; 
    public void setUrlString(String url) { 
     URL url = null; 
     try { 
      url = new URL(url); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 
     WSDL_LOCATION = url; 
    } 

Natürlich wird das Feld nicht verfügbar sein, bis schließlich der Bohnen ihre Eigenschaften gehabt haben festgelegt, aber der Frühling hat einige Schnittstellen dafür. InitializingBean zum Beispiel.

+0

Danke. Ich habe meinen Beitrag bearbeitet, um vollständigen Code zu haben. Diese URL sollte also für den Konstruktor verfügbar sein. Kann ich das Gleiche machen? – vishnu

+0

@vishnu: Das ist komplexer. Ich würde vorschlagen, die WSDL_LOCATION in eine Art globales Bean zu verschieben, anstatt ein statisches Feld zu belassen. Oder Sie können einfach den Code1() -Konstruktor eine einzelne Zeichenfolge mit der WSDL-URL nehmen. – sblundy

+0

Wir können keine statische Setter-Methode injizieren, ich kann den Code1() -Konstruktor nicht verwenden, da er einen Fehler gibt, da diese Klasse von der Service-Klasse geerbt wird. Also muss ich für diese globale Bohne gehen? Wie macht man das. Es ist sehr baic. Vielen Dank für Ihre Zeit – vishnu

4

Es gibt keine Möglichkeit für Spring, ein statisches Endfeld von außen zu initialisieren.

Es wäre einfach nicht möglich. Statische Endfelder werden bei der Klassenladezeit initialisiert, lange bevor Spring die Möglichkeit hat, etwas zu tun (und Sie können sowieso keine Parameter an den ClassLoader übergeben).

Sie müssen Ihr Design überdenken. Das kann nicht funktionieren!

+0

Vielen Dank. Dies ist eine Klasse für Client-Webservice generiert. Ich möchte WSDL-URL-Wert von der Konfiguration übergeben, da dieser Wert von Dev zu Produktion variiert. Was schlägst du dafür vor? – vishnu

0

Wie schon jemand erwähnt hat, funktioniert Spring nicht so. Ein statischer Initialisierer würde ausgeführt werden, bevor Spring den Wert beeinflussen könnte.

Was Sie wahrscheinlich tun sollten, ist instanziieren Sie Ihre Code1-Klasse im Frühjahr als Bean und legen Sie den Wert dort fest. Wenn der Wert von mehreren Instanzen Ihres Beans gemeinsam genutzt werden muss, müssen Sie den Wert im Frühjahr als Singleton-Bean im Bean definieren.

1
@Component 
public class UserUtils 
{ 
    private static UserAccessor userAccessor; 

    /** 
    * Sets the user DAO. This method should never be called except by Spring 
    * @param userAccessor The user accessor to set 
    */ 
    @Autowired(required = true) 
    public void setUserAccessor(userAccessor UserAccessor) { 
     UserUtils.userAccessor = userAccessor; 
    } 
} 

Ressourcen: http://www.connorgarvey.com/blog/?p=105#codesyntax_1