2015-01-10 7 views
-1

이것은 여러 시간 동안 나를 혼란스럽게 만들었지 만 본질적으로 발생하지 않을 것 같지만 나와 함께하시기 바랍니다. 나는 증거가 있다고 믿는다.Java SOAP 서비스를 사용하면 javax.mail의 인쇄 가능한 메일 캡슐화가 깨집니다.

나는 이것을 최소한의 테스트 케이스 (아래)로 단순화했다. 코드를 테스트하려면 EmailTest.java (아래)을 사용한 다음 SOAP 서비스를 가져와야합니다. 이를 위해 내가 사용 : 편의를 위해

wsimport -d bin -s src -keep -extension 'http://www.webservicex.net/stockquote.asmx?wsdl' 

는 또한 GitHub의 here에 코드를 넣어, 그래서 당신은 단순히 그것을 복제하고 실행할 수 있습니다; 이미 wsimport이 있습니다.

은 다음과 어떤 코드가 아래 수행하는대로하십시오 quoted-printable 부분을 생성

  • 전화 testMime()을, 다음, 올바르게 표시 (상위 비트 세트 문자 시퀀스 =로 시작과 탈출로);
  • 은 새로운 웹 서비스 진입 점을 얻는 stockQuoteTest을 호출합니다. 실제로 웹 서비스를 호출 할 필요는 없습니다.
  • quoted-printable 부분을 다시 생성하지만 문자를 이스케이프 처리하지 않고 잘못 표시합니다. system.out.Println 그러면 (예측 가능하게) 이들이 ?으로 바뀝니다.

나는 동일한 것을하는 여러 개의 SOAP 라이브러리를 사용했습니다. 간단한 데모를 선택했습니다. SOAP 종점을 실제로 호출 할 필요는 없습니다. getPort (여기에서 getStockQuoteSoap12)에 대한 호출이 문제인 것으로 보입니다.

지금까지 디버깅을 통해 내가 알고있는 기본 Java 인코딩 중 어느 것도 변경되지 않았으며 두 번째 호출에서 quoted-printable 인코더가 호출되지 않는다고 문제가있는 것으로 나타났습니다. 이는 part.dh.dataContentHandler이 작동 할 때 ObjectDataContentHandler 유형으로 설정되고 작동하지 않을 경우 StringDataContentHandler 유형으로 설정되기 때문입니다.

여기에 무슨 일이 일어나고 있는지 또는 해결 방법에 대한 아이디어가 있습니까? 내가 사용

javax.mail 1.5.2 (최신하지만,하지만, 이전 버전이 동일) - 그리고

$ java -version 
java version "1.6.0_65" 
Java(TM) SE Runtime Environment (build 1.6.0_65-b14-462-11M4609) 
Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-462, mixed mode) 

여기 여기 EmailTest.java

package emailtest; 

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import javax.mail.MessagingException; 
import javax.mail.internet.MimeBodyPart; 

// use any SOAP service. This one was generated using 
// wsimport -d bin -s src -keep -extension http://www.webservicex.net/stockquote.asmx?wsdl 
import net.webservicex.StockQuote; 
import net.webservicex.StockQuoteSoap; 

public class Emailtest { 

    public static void stockQuoteTest() { 
     StockQuote stockService = new StockQuote(); 
     StockQuoteSoap s = stockService.getStockQuoteSoap12(); 
     // We don't actually need to call SOAP to demonstrate the problem 
     // System.out.println("quote is "+s.getQuote("GOOG")); 
    } 

    public static void testMime() throws MessagingException { 
     String msg = "\u0287x\u01DD\u0287 u\u028Dop \u01DDp\u1D09sdn"; 

     MimeBodyPart messageBodyPart = new MimeBodyPart(); 
     messageBodyPart.setText("" + msg, "utf-8"); 
     messageBodyPart.setHeader("Content-Type", "text/plain; charset=\"utf-8\""); 
     messageBodyPart.setHeader("Content-Transfer-Encoding", "quoted-printable"); 

     ByteArrayOutputStream os = new ByteArrayOutputStream(); 
     try { 
      messageBodyPart.writeTo(os); 
      String aString = new String(os.toByteArray(),"UTF-8"); 
      System.out.println(aString); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     System.out.println(""); 
    } 

    public static void main(String args[]) { 
     try { 
      System.out.println("Before call to SOAP:"); 
      testMime(); 

      stockQuoteTest(); 

      System.out.println("After call to SOAP:"); 
      testMime(); 
     } catch (MessagingException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

의를 출력입니다 :

Before call to SOAP: 
Content-Type: text/plain; charset="utf-8" 
Content-Transfer-Encoding: quoted-printable 

=CA=87x=C7=9D=CA=87 u=CA=8Dop =C7=9Dp=E1=B4=89sdn 

After call to SOAP: 
Content-Type: text/plain; charset="utf-8" 
Content-Transfer-Encoding: quoted-printable 

?x?? u?op ?p?sdn 

아, 중요한 경우 인코딩 된 텍스트는

입니다.

정상적인 문자를 사용하여 만든 '거꾸로 된'글자가 보이지 않는 곳에서 quoted-printable이 작동하지 않는 곳 (두 번째 호출)을 볼 수 있습니다. 조사에 따르면 단순히 quoted-printable을 전혀하지 않는 것으로 나타났습니다.

업데이트

이 JAF 오히려 자신에있을 일어나는 text/plain 핸들러에 의존에 대한 javax.mail에 a bug in jax-ws 틀림없이 버그로 나타납니다. 해결 방법에 대한 아이디어가 있습니까? (자바 7 사용, jax-ws에서 문제가 해결되지 않는 경우)

+0

좋아, 왜 downvote없이 explainatino? 최소한의 예제만으로 완전히 복제 가능한 문제입니다. – abligh

답변

0

JAX-WS (Java 7에서 수정 됨)의 this bug이 원인이라고 생각합니다. JAX-WS 클래스가로드되면

JAX-WS는 DataHandler 문자 집합을 존중하지 않는 유형 text/plain에 대한 소개 JAF를 사용 (예 : text/plain; charset="utf-8".,이. javax.mailtext/plain 핸들러보다는이 다음 용도로 사용된다 인코딩이 지정보다는 자바 플랫폼의 디폴트 인코딩,

두 가지 가능한 작업 차선책은 다음과 같습니다. 자바 7 (특히 JAX-WS 용)

  • 업그레이드

  • 명령 행에서 -Dfile.encoding=UTF-8으로 응용 프로그램을 실행하여 Java 기본 파일 인코딩을 설정하십시오. 분명히 이것은 다른 결과가있을 수 있습니다