2011-01-07 4 views
-1

다음 요구 사항이 있습니다. 스프링 설정 파일을 통해 http:\\localhost:9080\testws.cls 값을 설정 기 주입으로 전달하고 싶습니다. 이 정적 변수 설정 기 주입은 어떻게 할 수 있습니까? TEST1_WSDL_LOCATION스프링의 정적 설정 메소드 삽입

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); 
    } 

} 

도와주세요.

+2

? 싱글 톤 스코프가있는 객체의 인스턴스 변수로 만들고 일반적인 방법으로 삽입하십시오. –

+0

작업 솔루션은 이미 다른 게시물에서 논의되었습니다. http://stackoverflow.com/questions/2763279/injecting-values-for-static-constants-in-spring. http://www.connorgarvey.com/blog/?p=105도 확인하십시오. 나를 위해 일했다. – spujap

답변

1

bean 인스턴스에 setter를 사용할 수 있습니다.

물론 콩은 모든 빈이 자신의 속성이 설정 될 때까지 사용할 수 없지만 Spring은 일부 인터페이스를 가지고 있습니다. 예를 들어 InitializingBean.

+0

고맙습니다. 내 게시물을 편집하여 완전한 코드를 작성했습니다. 따라서이 URL은 constructior에 사용할 수 있어야합니다. 나는 똑같이 할 수 있을까? – vishnu

+0

@vishnu : 그것은 더 복잡합니다. WSDL_LOCATION을 정적 필드를 남겨두기보다는 전역 bean의 일종으로 옮기는 것이 좋습니다. 또는 Code1() 생성자가 WSDL url을 사용하여 단일 문자열을 만들도록 할 수 있습니다. – sblundy

+0

우리는 정적 setter 메서드 주입을 할 수 없어, 나는이 클래스가 서비스 클래스에 의해 상속되기 때문에 오류를주기 때문에 Code1() 생성자를 사용할 수 없다. 그래서이 글로벌 콩을 갈 필요가 있습니까? 어떻게하는지. 그것은 매우 위독합니다. 감사합니다. – vishnu

4

외부에서 고정 최종 필드를 초기화하는 방법은 없습니다.

그냥 불가능합니다. 정적 최종 필드는 Spring이 아무 것도 할 수 없을 때까지 클래스 로딩 시간에 초기화됩니다. 그리고 어쨌든 ClassLoader에 매개 변수를 전달할 수 없습니다.

디자인을 다시 생각해야합니다. 이것은 작동하지 않습니다!

+0

감사합니다. 이것은 클라이언트 웹 서비스 용으로 생성 된 클래스입니다. 이 값은 Dev에서 프로덕션으로 다양하므로 구성에서 WSDL url 값을 전달하고 싶습니다. 당신은 이것을 위해 무엇을 제안합니까? – vishnu

0

누군가 이미 언급했듯이, 스프링은 그런 식으로 작동하지 않습니다. Spring이 값에 영향을 줄 수 있기 전에 정적 이니셜 라이저가 실행됩니다.

Spring에서 Code1 클래스를 bean으로 인스턴스화하고 거기에 값을 설정하면됩니다. 값을 bean의 여러 인스턴스가 공유해야하는 경우, 값을 Spring의 단일 범위의 bean으로 만드십시오.

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; 
    } 
} 

자원 : http://www.connorgarvey.com/blog/?p=105#codesyntax_1은 정적 만들기의 포인트는 무엇