2010-06-03 9 views
20

Trong ứng dụng web của tôi, tôi cần sử dụng Saxon TransformerFactory để sử dụng XSLT 2.0 nhưng tôi không thể sử dụng phương thức setProperty vì tôi không có quyền này trên máy chủ web và có một Quản lí an ninh.Cách chọn saxon TransformerFactory trong Java

Vì vậy, tôi đã đọc mà chúng ta có thể làm điều này:

Sử dụng các API dịch vụ (như trình bày chi tiết trong đặc tả JAR), nếu có, để xác định classname. API dịch vụ sẽ tìm một tên lớp trong tệp META-INF/services/javax.xml.transform.TransformerFactory trong các jars có sẵn cho thời gian chạy.

Tôi tìm thấy tệp này trong WEB-INF/lib/saxon9.jar nhưng khi tôi thực hiện TransformerFactory, nhà máy mặc định luôn được chọn thay vì nhà máy Saxon.

Làm cách nào để chọn Nhà máy biến áp Saxon?

Cảm ơn

+0

Tóm tắt tất cả các phương pháp tiếp cận bên dưới (và nhiều hơn nữa) có thể được tìm thấy tại đây: http://stackoverflow.com/questions/11314604/how-to-set-saxon-as-the-xslt-processor-in-java –

Trả lời

11

Bạn có thể thử bằng cách thiết lập thuộc tính hệ thống trong mã của bạn như

System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl"); 

làm điều này trước khi nhận được một thể hiện của TransformerFactory.

Lưu ý: điều này sẽ buộc tất cả các ứng dụng web trên Tomcat của bạn sử dụng saxon - vì vậy bạn phải đảm bảo mọi ứng dụng web khác đang sử dụng mặc định đều được.

5

Nếu ứng dụng của bạn thực sự đòi hỏi saxon và sẽ không làm việc với bộ xử lý khác thì nó có lẽ sẽ là tốt để nhanh chóng TransformerFactory saxon trực tiếp sử dụng new net.sf.saxon.TransformerFactoryImpl()

22

Cách thích hợp để làm điều này là bằng cách xác định lớp nhà máy khi nhận được một TransformerFactory mới. Tôi không nghĩ rằng việc thực hiện một nhà máy cụ thể sẽ hoạt động - tôi tin rằng biến áp hệ thống mặc định vẫn có thể được trả lại (ít nhất đó là những gì đã xảy ra khi tôi có xalan và saxon trong classpath).

dụ:

TransformerFactory tFactory = TransformerFactory.newInstance("org.apache.xalan.processor.TransformerFactoryImpl",null); 

hoặc cho saxon

TransformerFactory tFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl",null); 

Javadocs:

Lấy một ví dụ mới của một TransformerFactory từ lớp nhà máy tên. Chức năng này hữu ích khi có nhiều nhà cung cấp trong đường dẫn lớp học . Nó cho phép kiểm soát nhiều hơn đối với ứng dụng vì nó có thể chỉ định nhà cung cấp nào sẽ được tải. Sau khi một ứng dụng đã nhận được tham chiếu đến một TransformerFactory, có thể sử dụng nhà máy để định cấu hình và lấy các phiên bản biến áp.

+1

Điều này hoạt động như của Java v6 (http://docs.oracle.com/javase/6/docs/api/javax/xml/transform/TransformerFactory.html vs http://docs.oracle.com/javase/1.5.0 /docs/api/javax/xml/transform/TransformerFactory.html) –

+1

Điều này không làm việc với bản phát hành Oracle Fusion Middleware 11.1.1.5.0 vì nó sử dụng các triển khai cũ hơn trong các tệp jar của ứng dụng khách của nó. – sweetfa

8

Tạo tệp META-INF/services/javax.xml.transform.TransformerFactory với nội dung: net.sf.saxon.TransformerFactoryImpl. Đó là nó.

+0

Điều này không hiệu quả đối với tôi. Tôi đã sử dụng thư mục META-INF chính của webapp của tôi. Tôi có cần sử dụng cái khác không? – Carsten

+0

Tôi đã tìm ra. Nó phải kết thúc trong WEB-INF/classes/META-INF/... – Carsten