2017년 10월 24일 화요일

HTTP 헤더, soap 헤더 추가

1.HTTP 헤더 추가.
		ShoppingService ss = new ShoppingService();
ShoppingServiceSoap port = ss.getShoppingServiceSoap();

Client client = ClientProxy.getClient(port);

// Creating HTTP headers
Map<String, List<String>> headers = new HashMap<String, List<String>>();
headers.put("XXX-SOA-SERVICE-NAME", Arrays.asList("SampleService"));
headers.put("XXX-SOA-APP-NAME", Arrays.asList("SampleServiceAppv1"));

// Add HTTP headers to the web service request
client.getRequestContext().put(Message.PROTOCOL_HEADERS, headers);

 

2. soap 헤더 추가
		ShoppingService ss = new ShoppingService();
ShoppingServiceSoap port = ss.getShoppingServiceSoap();

Client client = ClientProxy.getClient(port);



List<Header> headersList = new ArrayList<Header>();

Header testSoapHeader1 = new Header(ss.SERVICE, "SOAP Header Message 1", new JAXBDataBinding(String.class));
Header testSoapHeader2 = new Header(new QName("http://naver.com", "soapheader2"), "SOAP Header Message 2", new JAXBDataBinding(String.class));
Header testSoapHeader3 = new Header(new QName("Element"), "SOAP Header Message 3", new JAXBDataBinding(String.class));

headersList.add(testSoapHeader1);
headersList.add(testSoapHeader2);
headersList.add(testSoapHeader3);

// Add SOAP headers to the web service request
client.getRequestContext().put(Header.HEADER_LIST, headersList);


/* 실제 request
...
<soap:Header>
<ShoppingService xmlns="http://www.auction.co.kr/APIv1/ShoppingService">SOAP Header Message 1</ShoppingService>
<soapheader2 xmlns="http://naver.com">SOAP Header Message 2</soapheader2>
<EncryptedTicket>SOAP Header Message 3</EncryptedTicket>
...
*/

soap 로그 출력

cxf 로 생성된 파일을 이용하여 작업 할 때, soap request나 response 가 필요한 경우가 있다.

  1. Feature를 이용하는 법


		LoggingFeature logFeat = new LoggingFeature();
logFeat.setPrettyLogging(true);
ShoppingService ss = new ShoppingService(logFeat);
ShoppingServiceSoap port = ss.getShoppingServiceSoap();

 

2. InInterceptor를 이용하는 법.
		ShoppingService ss = new ShoppingService();
ShoppingServiceSoap port = ss.getShoppingServiceSoap();

Client client = ClientProxy.getClient(port);
client.getInInterceptors().add(new LoggingInInterceptor());
client.getOutInterceptors().add(new LoggingOutInterceptor());

 

Feature를 이용한 방법이 요청이 정렬되어서 나오기 때문에 추천한다.

"Result" 속성은 이미 정의되었습니다. 를 사용하여 이 충돌을 해결하십시오.

cxf로 웹서비스 클라이언트 자동 생성시 아래와 같은 에러 발생.
"Result" 속성은 이미 정의되었습니다. &lt;jaxb:property>를 사용하여 이 충돌을 해결하십시오.

wsdl element로 java 파일을 만들때, element 명으로 java 파일명을 생성하는 데, 중복된 경우 발생하는 에러이다.

-autoNameResolution 옵션으로 자동으로 변경 된다고 하는데, 왜인지 해당 옵션이 먹지 않는다.

 

binding 수동으로 지정해서 생성하면 된다고 하는 데,  잘 안됨.

그냥 wsdl 을 xml 로 저장하고 element 명을 수정하여 처리 하였다.

 

 

참조

 

cxf 웹서비스 클라이언트 자동 생성 파일 타입 지정.

cxf 로 웹서비스 클라이언트 생성시 생성되는 파일이 EUC-KR로 생성된다.
-encoding UTF-8 를 사용하여 생성되는 파일 타입을 강제로 지정이 가능하다.
해당 옵션을 wsdl2java.bat 넣고 이클립스에서 생성시에는 해당옵션이 적용되지 않는다.
이클립스에서는 wsdl2java.bat를 사용하지 않고 org.apache.cxf.tools.wsdlto.WSDLToJava 를 바로 사용하기 때문이다.

어쩔수 없이 이클립스 console에 출력되는 wsdl2java... command를 복사해서
-encoding UTF-8 를 붙여서 수동으로 생성 후 소스에 붙여 넣었다.