이것은 여러 시간 동안 나를 혼란스럽게 만들었지 만 본질적으로 발생하지 않을 것 같지만 나와 함께하시기 바랍니다. 나는 증거가 있다고 믿는다.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에서 문제가 해결되지 않는 경우)
좋아, 왜 downvote없이 explainatino? 최소한의 예제만으로 완전히 복제 가능한 문제입니다. – abligh