2009-08-10 24 views
14

Tôi có một ứng dụng đang chạy một cách vui vẻ dưới Java 1.5 trong khoảng một năm. Chúng tôi đã có các hộp được cập nhật và đã cài đặt Java 1.6.Phương thức Java hoạt động trong 1,5 nhưng không 1,6

Sau khi triển khai ứng dụng lên máy chủ mới, chúng tôi đã tìm thấy ứng dụng đang ném một ngoại lệ khi nó cố chuyển đổi một số XML. Chúng tôi không thể hiểu tại sao điều này xảy ra cho đến khi chúng tôi triển khai nó cục bộ và điều tương tự cũng xảy ra. Sau khi thay đổi SDK thành v1.5, sự cố đã dừng và ứng dụng chạy tốt.

Đây là nguồn của phương pháp:

import java.io.StringWriter; 
import javax.xml.transform.Result; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerConfigurationException; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

import org.w3c.dom.Element; 
import org.w3c.dom.Node; 


    public static String xmlToString(Node node) { 
    try { 
     Source source = new DOMSource(node); 
     StringWriter stringWriter = new StringWriter(); 
     Result result = new StreamResult(stringWriter); 
     TransformerFactory factory = TransformerFactory.newInstance(); 
     Transformer transformer = factory.newTransformer(); 
     transformer.transform(source, result); 
     return stringWriter.getBuffer().toString(); 
    } catch (TransformerConfigurationException e) { 
     e.printStackTrace(); 
    } catch (TransformerException e) { 
     e.printStackTrace(); 
    } 
    return null; 
    } 

Nó đâm vào "transformer.transform (nguồn, kết quả);" có ngoại lệ:

Exception in thread "main" java.lang.AbstractMethodError: org.apache.xerces.dom.DocumentImpl.getXmlStandalone()Z 
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.setDocumentInfo(DOM2TO.java:373) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:127) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:94) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:662) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:708) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313) 

Có ai biết bất kỳ thay đổi nào được thực hiện cho Java giữa hai phiên bản có thể gây ra điều này không? Sửa chữa dễ nhất là gì?

Cảm ơn sự giúp đỡ của bạn.

+4

Dường như bạn có một triển khai Xerxes xung đột ở đâu đó trong đường dẫn lớp học của bạn. – akarnokd

+1

Những lọ liên quan đến xml nào nằm trong classpath của bạn? – Yishai

Trả lời

18

Tôi không nhớ nếu nó nằm trong khoảng từ 1,4 đến 1,5 hoặc 1,5 và 1,6, nhưng thư viện Xalan đi kèm với JVM từ Sun đã thay đổi tên gói của họ. Tôi chạy vào một cái gì đó tương tự khoảng 2 năm trước đây. Tôi nghĩ rằng những gì tôi phải làm là rõ ràng tàu thực hiện xalan của riêng tôi để khắc phục vấn đề.

UPDATE: Điều này có thể có được những gì tôi đã nghĩ đến việc, mặc dù nó vẫn có thể được liên quan đến vấn đề của bạn link text

+7

Bạn chỉ nên sử dụng API JAXP hoặc phụ thuộc vào các thư viện xerces, không bao giờ được thực hiện do ánh nắng cung cấp (sẽ khác nhau giữa các bản phát hành). – wds

+1

Tôi thấy một trường hợp điều này đang xảy ra và mã đang gọi TransformerFactory để tạo một Biến áp, sau đó chuyển đổi() trên Biến áp và nó đang ném ngoại lệ này. Điều này có vẻ là cách đúng đắn để làm điều đó. Mã này hoạt động tốt trong Java 5 và sau khi nâng cấp lên Java 6, nó đang ném ngoại lệ này. Bao gồm cả bản sao xalan của riêng tôi đã khắc phục vấn đề. –

+0

Tôi có thể tìm bản sao xalan của riêng mình ở đâu? và làm thế nào để tôi bao gồm và thay thế những gì được đưa ra bởi oracle ??? –

3

Đây là vấn đề vì jar (Xalan) phiên bản xung đột. Tháo lọ và đưa ra một thử

+0

Tôi đã thử thêm một JAR Xerces mới nhưng điều này đã không giải quyết theo câu trả lời upvoted hàng đầu, vì vậy tôi đã thử đề xuất của bạn và loại bỏ JAR Xerces khỏi đường dẫn xây dựng của tôi và nó hoạt động, cảm ơn! – Kairan

+0

XALAN có trong rt.jar Bạn đang nói tôi nên loại bỏ jar khỏi đường dẫn jre/lib? –

0

Bạn có thể muốn sử dụng phiên bản mới nhất từ ​​Xerces (Tôi tin rằng nó phải được compitable với JDK1.6)

7

Vấn đề này được biết là xảy ra trên JDK 1.6 với một xerces cũ. jar, khi trên classpath, cung cấp DocumentBuilderFactory của riêng nó.

Sự cố không xảy ra khi sử dụng nhà máy mặc định nền tảng.

Bạn có thể muốn kiểm tra WEB-INF/lib hoặc tương đương.

2

Tôi gặp phải điều này java.lang.AbstractMethodError trong mã của tôi.

Tại thời điểm thay đổi phiên bản của bất kỳ thư viện nào không phải là một tùy chọn, nhưng tôi đã tìm thấy giải pháp thay thế bằng cách so sánh với mã khác hoạt động bí ẩn. Có lẽ điều này có thể giúp người khác ra khỏi đó.

Tất cả đều phải làm với Tài liệu tôi đã chuyển vào DOMSource(). Nguyên tôi đã tạo ra một tài liệu theo cách tiêu chuẩn:

private static Document documentFromInputStream(InputStream in) throws ParserConfigurationException, SAXException, IOException { 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document doc = builder.parse(new InputSource(in)); 
    return doc; 
} 

Để việc xung quanh vấn đề này, tôi thay đổi dòng máy như sau:

 DocumentBuilderFactory factory = new DocumentBuilderFactoryImpl(); 

Bây giờ tôi không còn nhận được sự ngoại lệ .

+0

Tuyệt vời! không phải đối phó với xung đột jar. Cảm ơn bạn. –

0

Tôi có cùng sự cố & đã thay thế xercesImpl-2.0.2.tệp jar với xercesImpl-2.11.0.jar trong đường dẫn lớp của ứng dụng của tôi. Làm việc tốt.

0

Điều này phù hợp với tôi.

TransformerFactory factory = TransformerFactory.newInstance(); 
    Transformer transformer = factory.newTransformer(); 
      transformer.setOutputProperty(OutputKeys.METHOD, "xml"); 
    DOMSource source = new DOMSource(doc); 
      StreamResult result = new StreamResult(sWout); 
      transformer.transform(source, result);