2021년 6월 26일 토요일

CXF Webservice(SOAP) Provider for File Attachment In JAVA and SAP PO - Server Side

테스트환경

Eclipse Version 2018-12(4.10.0)
JDK 1.8._201
Tomcat 8.5
CXF 3.3.3

SOAP UI -> JAVA(CXF) 파일 전송

1. Webservice(SOAP) Provider 프로젝트 생성

이클립스에서 Dynamic Web Project를 만들어 웹서비스를 위한 클래스와 메서드를 생성
오른쪽 마우스버튼 > Web Service > Create Web Service를 클릭하여 해당하는 메서드의 CXF 웹서비스를 생성하면 WEB-INF 아래 cxf-beans.xml과 WSDL파일이 생성됩니다.

톰켓 기동시 아래와 같은 에러가 발생될수 있음
Offending resource: ServletContext resource [/WEB-INF/cxf-beans.xml]; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException:IOException parsing XML document from class path resource [META-INF/cxf/cxf-extension-soap.xml]; nested excetpion is java.ioFileNotFoundException:class path resource [META-INF/cxf/cxf-extension-soap.xml] cannot be opened because it does not exist

위에러에 대한 대한 원인은 에러의 파일을 못찾아서 발생된에러인데
자동생성된 cxf-beans.xml파일의 내용에 경로에 해당하는 파일을 생성해주면 됩니다.
<import resource="classpath:META-INF/cxf/cxf.xml" />
<!--<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> -->
<import resource="classpath*:META-INF/cxf/cxf-extension-*.xml" />


참고사이트:
where to find cxf/cxf.xml, cxf-extension-soap.xml, cxf-servletxml

2. DataHandler를 사용한 파일수신 서비스 생성

이클립스에서 AXIS에서 웹서비스를 자동 생성할때와 다르게 CXF로 생성되는 Interface파일의 어너테이션 수정이 필요합니다.

FileServiceImpl.java(어너테이션 수정)
@MTOM
@WebService(name = "", targetNamespace="")
public interface FileServiceImpl{
void uploadFile(@XmlMimeType("application/octet-stream") DataHandler dh)
}


cxf-beans.xml(프로퍼티 내용수정)
.xml파일 내용도 웹서비스 자동생성할때 내용이 자동으로 만들어지는데 여기서 파일수신을 위한 프로퍼티 내용을 추가했습니다.
<jaxws:endpoint
xmlns:tns="" id=""
implementor=""
wsdlLocation=""
endpointName=""
serviceName="" address="">
<jaxws:features>
<bean class="" />
</jaxws:features>
<jaxws:properties>
<entry key="mtom-enabled" value="true" />
<entry key="mtom-threshold" value=0 />
</jaxws:endpoint>
</jaxws:endpoint>


참고사이트:
How do i enable MTOM on the server side for a Web Service published using Grails with CXF?

FileService.java
SOAP UI에서 보낸 첨부파일을 수신하는 방법은 여러가지이나 그중 org.apache.tomcat.util.http.fileupload.IOUtils 클래스를 사용하였습니다.
.getInputStream() 사용하여 파일생성시 내용이 들어가지 않는 현상이 발생하여 .getContentType()을 InputStream으로 변환하였습니다.

참고사이트:
How to write content of datahandler to file?

3. SOAP UI를 사용한 파일 전송

자바로 SOAP Client소스를 구현하지 않고 사전에 SOAP UI를 통해 파일전송 테스트를 진행할수 있습니다.
사용방법은 해당 WSDL이나 WSDL URL를 임포트 후에 Request 구조를 볼수 있습니다.
<jax:uploadData>
<arg>cid:12343244</arg0>
</jax:uploadData>

이대로 호출하게 되면 No attachment for id 12343244 found in 에러가 발생되는데 해결방법은
cid:12343244 -> cid:sample.xsd로 변경해서 호출해주면 되는데
이 파일명정보는 요청할때 헤더정보에 담긴 파일명을 넣어주면 되는것 같습니다.

참고사이트:
SOAP Attachments and Files in SOAP UI
SOAP request with mtom attachment: No attachment for id <id> found in [attachment]

SOAP UI -> SAP PO(SOAP Sender Channel) 파일전송

SOAP UI -> JAVA 소스로 호출했을때는 정상적으로 파일이 수신되었는데 만약 SOAP UI -> SAP PO -> JAVA라면 어떨까요?

http://<host>:<port>/XISOAPAdapter로 호출했을경우 PO로그를 보면 Message Content에 attachment-1이 보이는데 클릭하면 파일을 다운로드 받을수 있습니다. 만약 SOAP UI에서 파일을 하나 더 추가하고 전송하면 attachment-2가 추가로 확인됩니다.

로그의 Open Message > Attachments를 보면 좀더 자세한 파일 정보를 확인할수 있습니다.

하지만 SOAP Receiver 통해 타겟에 전송시 아래와 같은 에러가 발생되는데 원인을 모르겠네요.
Interceptor for {}FileServiceService has thrown exception, unwinding now org.apache.cxf.binding.soap.SoapFault: MustUnderstand headers: [{http://sap.com/xi/XI/Message/30}DynamicConfiguration, {}HopList, {}System, {}ReliableMessaging,{}Main] are not understood

해당에러에 대해 원인과 해결방법을 찾게되면 내용추가 하겠습니다. 이외 대용량 파일 첨부같은경우는 좀더 테스트가 필요해보이네요.

추가로 Adapter Type이 WS_AAE인 Sender Channel로 호출을 해보는 경우 URL은 http://<host>:<port>/XIAxisAdapter 인데요. SOAP UI에서는 Error reading XMLStreamReader SOAP 메시지가 확인 되는데 채널, 메시지모니터링, 로그뷰어에서 이력을 찾을수 없고 해당 메시지가 어디서 오는건지 알수가 없었습니다. Status를 보면 500 Internal Server Error가 발생되는데 말이죠..

이번에는 타겟채널을 WS_AAE로 변경 후에 XISOAPAdapter URL로 호출해보니 다른에러가 발생되네요.
org.apache.cxf.binding.soap.SoapFault: A SOAP 1.2. message is not valid when sent to a SOAP 1.1 only endpoint

WS타겟채널의 SOAP Version을 1.2에서 1.1로 변경후 호출해보니 다른에러가 발생됩니다.
org.apache.cxf.interceptor.Fault: Message part {}webServicesServerTest was not recognized.(Does it exist in service WSDL?)

원하는 결과를 얻을수 없는 과정이였지만 그래도 좋은 공부였던것 같습니다.
SOAP UI를 통해 호출할때는 첨부파일이 잘 전송은 되는것 같은데 자바에서 Client로 파일전송시 에러가 발생되는데 원인을 잘 모르겠네요.

댓글 없음:

댓글 쓰기