2013-08-20 6 views
0

CXF 기반의 webservice를 개발 중입니다. 요청 중 하나는 클라이언트가 메시지의 일부로 선택적 PDF 파일을 업로드 할 수 있어야한다는 것입니다. 이것은 아주 사소한이었다MTOM 첨부 파일이 비어 있는지 확인하는 방법

Endpoint endpoint = Endpoint.publish("/myWs", new WsImpl(getServletContext())); 
SOAPBinding binding = (SOAPBinding) endpoint.getBinding(); 
binding.setMTOMEnabled(true); 

그리고 사용 : 나는 또한 MTOM에 대한 지원을 활성화 한

@XmlMimeType("application/octet-stream") 
@XmlElement(name = "InvoicePdf", required = false) 
private DataHandler invoicePdf = null; 

:

내 전송 객체에 getter 및 setter와 함께이 추가 한

DataHandler pdf2 = p_invoice.getInvoicePdf(); 
//pdf2.getInputStream(); 
//pdf2.writeTo(outputstream); 

모든 것이 효과적입니다. 파일을 받고 처리 할 수 ​​있습니다. 그러나 선택 사항이므로 클라이언트가 파일을 업로드하지 않는 경우가있을 수 있습니다. 문제는 클라이언트가 파일을 보냈지 만 통지하지 못한다는 것입니다.

  • pdf2.getInputStream()가 널
  • pdf2.getInputStream (없는) 일부 데이터를 포함
    • pdf2 널 아니다. 입력 스트림의 구문 분석을 건너 뛰고 PDF 서명을 찾고 싶습니다. 입력 스트림을 원하는 출력 스트림 (파일에 쓰기)에 전달하는 것이 훨씬 쉽기 때문에
    • DataHandler 또는 DataSource (pdf2.getDataSource()) API에서 파일 존재 여부를 결정하기위한 적절한 메소드 나 필드를 찾지 못했습니다. 나는 빈 DataHandler가 길이가 9 인 DataSource를 포함한다는 것을 디버그에서 확인한다. 불행히도 length 속성은 전혀 액세스 할 수 없습니다.

    파일 전송 여부를 결정하는 방법을 알려주세요.

    답변

    0

    해결 방법은 SOAP 메시지에서이 첨부 파일의 xml 태그를 건너 뛰는 것입니다. 그래서 내 실수는 빈 태그를 전송했다 :

    <InvoicePdf></InvoicePdf> 
    

    은 그럼 당신은 질문에 설명 된 동작을 얻을. 그러나이 태그를 완전히 건너 뛰면 DataHandel이 null이므로 파일이 전송되었는지 여부를 구별 할 수 있습니다.