2013-01-14 2 views
2

웹 서비스 (WS)에 문의해야합니다. JDK 1.6, maven 3.04, Spring 3.20 및 Apache의 CXF 2.7.2를 사용하고 있습니다. maven을 사용하여 wsdl 파일을 제공하여 WS 용 스텁을 만들었습니다. 나는 WS 클라이언트에 대한 스프링 설정을 가지고 있고 그것은 자바 코드에서 뭔가 REQ : 스프링 구성 CXF 클라이언트 - '주소'와 같은 하드 코드 된 변수 대체

같은 서블릿-context.xml에

<jaxws:client id="paymentClient" serviceClass="com.xxx.payment.Payment" 
    address="http://127.0.0:8088/mockPaymentBinding" <!-- SOAPUI mock --> 
    username="username" 
    password="secret" /> 
<!- username and password are for wsdl basic authentication --> 

보이는이

@Autowired 
com.xxx.payment.Payment client; 
.. 
// Set all needed parameters. 
PaymentGetBalanceResponse response = null; 
PaymentGetBalance getBalance = new PaymentGetBalance(); 
RequestGetBalance value = new RequestGetBalance(); 
value.setTransactionId("transActionId"); 
getBalance.setRequest(value); 

// Now call the WS and get the response 
response = client.getBalance(getBalance); // generated by the cxf -client argument. 

은 "응답"라인과 같이 보입니다 CXF에 의해 예로서 생성됩니다. 그런 다음 이클립스는 나에게 무언가가 빠져 있다는 것을 알려주고 (선택적으로), 나를 위의 라인 위에 작성한다. 그렇다면 뭔가 다른 것이 누락 된 것입니다. 결국 모든 매개 변수가 올바르게 채워집니다. 누락 된 모든 stuff/variables/objects는 생성 된 스텁 코드에 있습니다.

이것은 매력처럼 작동하지만 주소는 atm으로 설정되어 있습니다. 응용 프로그램의 구성 매개 변수는 간단한 데이터베이스에 저장됩니다. 내용은 스프링 빈을 사용하여 액세스 가능하므로 코드의 끝에서 config.getValue (URL)와 같은 것을 사용하여 변수를 얻을 수 있습니다.

나는 위의 코드에서 '주소'(URL WS)를 변경할 수 있기를 희망했지만 그렇게 할 방법을 찾지 못했습니다. 생성 된 스텁 코드에서 setter를 찾을 수 없습니다. 또 다른 방법은 spring servlet-context.xml 파일에서 변수를 사용하는 것입니다. 그러나 변수는 데이터베이스에서 가져와야합니다. 두 번째 대안. 아마/바닥에 시작하고 Objectfactorys (스텁에서)를 사용하여 객체를 만들려고합니다. 그런 다음 올바른 매개 변수 ('new'또는 setter 중 하나)를 설정 한 다음 맨 위로 이동하십시오. 동료가 '주소'가 아닌)이 작업을 수행 한 것으로 보입니다.하지만이 코드는 기껏해야 차선의/'지저분한'것입니다. 또한 정적이 아닌 사용자 이름과 암호를 구성 할 수 있기를 바랍니다. CXF 사이트에서 RTM이 상당히 많이 발생했지만 아무 소용이 없었습니다.

JaxWsProxyFactoryBean에 대해 알아보고 Springs @autowire 기능을 사용할 때 여기에 적용하는 방법을 알아낼 수 없습니다.

나는이 문제에 대해 두뇌를 깬 적이 있지만 내 뉴런이 서클에서 돌아 다니고있는 것 같습니다. 모든 도움말/포인터 정말 고맙게 생각합니다.

답변

1

CXF 사용자 가이드 : How to override the service address?. 내가 제대로 봄 설정을 추론 한 경우

,이 할 것이라고 생각 :

@Autowired 
    com.xxx.payment.Payment client; 
    // ... 
    BindingProvider provider = (BindingProvider)client.getServicePort(); 
    // You can set the address per request here 
    provider.getRequestContext().put(
     BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 
     "http://my/new/url/to/the/service");