2015-06-09 38 views
0

我試圖導入並運行現有的和工作的Java代碼轉換成的IntelliJ但我遇到了一些問題,這將導致我寫這個問題在這裏:行爲差異:的IntelliJ VS Eclipse的

我的風暴拓撲結構(JAVA)的代碼正在從Websphere MQ讀取數據以及接收到的消息,這是一個字節流,並由「Message Parser」項目解析;它解析這些字節流「字符串」並根據一些規則生成有意義的消息。

當我在Eclipse中運行它,它工作沒有任何問題,但在的IntelliJ它讓我看到有關消息解析器問題。我感覺到它作爲編碼的問題,並試圖:

  • 更改代碼文件編碼成UTF-8
  • 更改行分隔成爲相同(UNIX)

但這並沒有使我解析度。

因爲你們都有很好的專業知識的Java IDE,所以我希望你必須面對的IDE的Java代碼的許多倍的兼容性問題。 請讓我知道是否有任何方法可以解決此問題。

哪裏的問題是發生在下面給出的代碼:

public void execute(Tuple input) { 

    String strMessage = null; 
    Message posMsg = null; 
       Object jmsMsg = input.getValueByField(FieldEnum.FIELD_MESSAGE 
       .getFieldName()); 
     posMsg = ((JMSMessage) jmsMsg); 
     strMessage = convertStreamToString(posMsg); 

     System.out.println("Message recieved from MQ : "+ strMessage); 

     @SuppressWarnings("rawtypes") 
     Map parsedSegments = MessageParser.instance().parseMessage(
       strMessage); 

     @SuppressWarnings("serial") 
     Type nposMessageType = new TypeToken<Map<String, Map<String, String>>>() { 
     }.getType(); 
     String segmentsJson = gson.toJson(parsedSegments, nposMessageType); 

     System.out.println(" testing the messages "+segmentsJson); 
MessageDetail MessageDetail = new MessageDetail(
       Constant.TOPOLOGY_NAME, segmentsJson); 
     this.outputCollector.emit(Constant.STREAM_MSG_PARSER_SUCCESS, 
       new Values(MessageDetail)); 
     this.outputCollector.ack(input); 
} 


     /** 
* Convert stream to string 
* 
* @param jmsMsg 
* @return 
* @throws Exception 
*/ 
private static String convertStreamToString(final Message jmsMsg) throws Exception { 
    String stringMessage = ""; 
    BytesMessage bMsg = (BytesMessage) jmsMsg; 
    byte[] buffer = new byte[40620]; 
    int byteRead; 
    ByteArrayOutputStream bout = new java.io.ByteArrayOutputStream(); 
    while ((byteRead = bMsg.readBytes(buffer)) != -1) { 
     bout.write(buffer, 0, byteRead); 
    } 
    bout.flush(); 
    stringMessage = new String(bout.toByteArray()); 
    bout.close(); 
    return stringMessage; 
} 
+0

這將是很難告訴你什麼是錯的,如果我們不知道的IntelliJ正顯示出你的問題是什麼。 – Dragondraikk

+0

@Dragondraikk正如我所說:Intellij在解析從MQ接收的消息時遇到問題,而Eclipse解析它。 – tom

+0

當然,它會給你一個特定的錯誤信息?在你的問題中有這個問題會有所幫助。 – Dragondraikk

回答

2

你的代碼是難辭其咎的。您正在使用

new String(bout.toByteArray()); 

將字節轉換爲字符。這使用平臺默認編碼。從Eclipse運行時,與使用IntelliJ運行時不同,因爲IntelliJ(如果沒有錯誤)傳遞JVM選項,強制默認編碼爲UTF-8。

但這不是一個IntelliJ問題。如果您在默認編碼爲UTF-8的平臺(例如Linux和Mac)上運行程序,則代碼將以同樣的方式失敗。

每次轉換成字節字符,反之亦然,一定要明確地指定一個編碼。如果MQ正在生成消息,請閱讀其文檔以瞭解它使用哪種編碼,並確保使用相同的編碼。例如,如果是ISO-8859-1,使用

new String(bytes, StandardCharsets.ISO_8859_1) 
+0

感謝您指出。我正在改變邏輯來解析MQ消息併成爲獨立平臺。 – tom

+0

我試圖給予ISO_8859_1,同時將ByteStream轉換爲String,它在Eclipse中工作,但不在Intellij中。我在Intellij中將文件編碼,項目編碼等設置爲ISO_8859_1,但沒有優勢... 您能否提出任何建議否則這可能是根本原因呢? – tom

+0

不要盲目使用ISO_8859_1。這是一個例子。您需要**知道**將字符串轉換爲字節時使用的編碼,並在將字節轉換爲字符串時使用相同的編碼。 –