2012-02-12 32 views
9

Tôi đang tìm cách triển khai SOAP thay thế (javax.xml.soap), khác với Sun SAAJ. Lý do là vì tôi muốn triển khai WebService JAX-WS trên Tomcat AS của IBM JDK 5, nhưng vấn đề được biết là việc thực thi Sun SAAJ phụ thuộc vào các lớp Xerces được phân bổ lại (xem Ref Impl does not work with IBM JDKSAAJ test cases no longer work with IBM's SDK) và cách duy nhất cho điều đó là sử dụng một hồ sơ Maven tùy chỉnh để kéo com.sun.xml.parsers:jaxp-ri như:Phương án thay thế cho thực thi Sun SAAJ SOAP

<profiles> 
    <profile> 
     <id>pre-jdk5-profile</id> 

     <activation> 
      <jdk>(,1.4]</jdk> 
     </activation> 

     <dependencies> 
      <dependency> 
       <groupId>com.sun.xml.parsers</groupId> 
       <artifactId>jaxp-ri</artifactId> 
       <scope>runtime</scope> 
      </dependency> 
     </dependencies> 
    </profile> 
</profiles> 

tôi muốn thả hồ sơ này và chỉ đơn giản là thay thế thực hiện SOAP với một trong những hoạt ở khắp mọi nơi.

Tôi cho rằng việc triển khai SOAP nhà cung cấp có thể đi kèm với Apache Axis/Apache CXF (mà là dựa trên IBM SOAP4J) hoặc JBoss AS - vui lòng cung cấp thông tin dựa trên sở thích của tôi:

  • thực hiện nên dễ tách rời khỏi nhân viên nghỉ ngơi (tốt nhất là một bình có trọng lượng nhẹ).
  • Triển khai phải hỗ trợ SOAP messages with attachments.
  • Triển khai phải tương thích với Java5 bytecode.
  • Nếu triển khai có sẵn trong Maven Central, đây là điểm cộng.

Tài liệu tham khảo:

Trả lời

6

Sau khi duyệt qua, tôi đã có giải pháp tiềm năng sau đây của sự cố. Tôi đã khám phá hậu duệ của javax.xml.soap.MessageFactory bằng cách sử dụng grepcode.com là gì.

Ngoài tiêu chuẩn com.sun.xml.messaging.saaj.soap.MessageFactoryImpl, tôi đã tìm thấy (như vụ):

  • org.apache.axis2.saaj.MessageFactoryImpl trong org.apache.axis2:axis2-saaj:1.6.1. JAR này thông báo chính xác các nhà máy qua số META-INF\services\javax.xml.soap.MessageFactoryMETA-INF\services\javax.xml.soap.MetaFactory để không cần điều chỉnh khác. Phiên bản này (theo Maven Central) đã được phát hành vào năm 2011, rất ít phụ thuộc, được khuyến nghị.
  • org.jboss.ws.core.soap.MessageFactoryImpl trong org.jboss.ws.native:jbossws-native-core:3.2.1.Beta2 từ JBoss 3.x. Trông khá cũ và có lẽ JBoss không hỗ trợ phát triển của nó nữa vì tôi có thể tìm thấy cái bình bên ngoài maven trung tâm (here). Rất nhiều phụ thuộc, kích thước 1.8M, không được khuyến khích.
  • org.apache.openejb.server.webservices.saaj.MessageFactoryImpl trong org.apache.openejb:openejb-webservices:4.0.0-beta-2org.apache.geronimo.webservices.saaj.GeronimoMessageFactory trong org.apache.geronimo.modules:geronimo-webservices:3.0-M1. Trong thực tế, một trong hai nhà máy này là trình bao bọc/runtime_locator cho việc triển khai Axis2 hoặc Sun (xem SaajFactoryFinderSAAJFactoryFinder). Không được xem xét.

Dòng dưới cùng: Lựa chọn duy nhất có thể chấp nhận là triển khai Axis2.

+0

Điều đó có thể hiệu quả. Nếu bạn không thành công với Axis2, bạn có thể xem xét việc sử dụng Spring WS để làm việc với JDK từ 1.4 trở lên. – TechTrip

+1

(không may) Từ [spring-ws-parent-2.0.4.RELEASE.pom] (http://mirrors.ibiblio.org/pub/mirrors/maven2/org/springframework/ws/spring-ws-parent/2.0 .4.RELEASE/mùa xuân-ws-cha-2.0.4.RELEASE.pom): ' com.sun.xml.messaging.saaj saaj-impl 1.3.2 'mà là một dấu hiệu cho thấy có lẽ Spring-WS sử dụng Sun SAAJ và họ bằng cách nào đó giải quyết cùng một vấn đề. –

+0

Vâng, xấu của tôi, xấu xí. – TechTrip

0

Mặc dù tôi không biết câu trả lời cho câu hỏi chính xác của bạn, tôi có một giải pháp làm thế nào bạn có thể làm cho Sun SAAJ (và JAX-WS RI) hoạt động theo JRE 1.5. Lý do tại sao có những rắc rối khi chạy JAX-WS RI trong Java 5 thực sự là JAXP lỗi thời (Java 1.5 đi kèm với JAXP 1.3, trong khi JAX-WS RI yêu cầu JAXP 1.4), và vì JAX-WS RI được mã hóa cứng để sử dụng Mặt trời JAXP RI (com.sun.org.apache ...). Vì JAXP 1.3 là một phần của JRE, bạn không thể thay thế nó một cách đơn giản (bạn có thể thay thế việc triển khai, nhưng không phải là API). Giải pháp là cổng xerces của activesoap, là phiên bản JAXP 1.4 được cắt giảm sử dụng đặt tên gói Sun JAXP RI (com.sun.org.apache.). Bạn có thể tìm thấy nó trong repo Maven:

<dependency> 
    <groupId>activesoap</groupId> 
    <artifactId>jaxb-xercesImpl</artifactId> 
    <version>1.5</version> 
</dependency> 

Đừng ngại đặt tên gói lạ - chỉ cần thử.

này thường được tất cả những gì cần thiết để chạy các Sun JAX-WS RI (và SAAJ như là một phần của nó) dưới Java 5.

Đừng quên KHÔNG bao gồm bất kỳ lọ JAXP API. Họ sẽ xung đột với API Java 5 JAXP.

+0

** rustyx **, cảm ơn vì những nỗ lực của bạn, nhưng câu trả lời của bạn đi sai hướng. Hồ sơ tôi đã đề cập không chính xác những gì bạn đề nghị: nếu kéo Sun Xerces triển khai và do đó giải quyết vấn đề theo 1.5 –

+0

1) tại sao không phải lúc nào cũng bao gồm bình jaxp? 2) bạn có chắc chắn rằng bạn chỉ có thể trao đổi SAAJ mà không cần chuyển sang một ngăn xếp JAX-WS khác không ?? – rustyx

+0

1) Có một số Xerces trong đường dẫn lớp của bạn không tốt và có thể dẫn đến các sự cố khó theo dõi, tại thời điểm nhất định, tôi không biết Xerces được sử dụng. 2) Tôi không biết. Nếu điều đó là không thể, tôi hy vọng cộng đồng sẽ nói như vậy. Mặt khác, tôi thấy không có vấn đề gì trong 'javax.xml.soap' có triển khai khác. Tại sao điều này sẽ buộc tôi phải chuyển sang ngăn xếp khác? –

0

Khó khăn. Có lẽ nhìn vào một trong những phiên bản Apache CXF. http://cxf.apache.org/

Bạn có thể muốn thử lật bộ nạp lớp, đóng gói các lọ bạn cần với ứng dụng web của bạn và tải trong mô hình PARENT_LAST. Đây có lẽ là đặt cược tốt nhất của bạn.

Tùy chọn thứ ba trong Tomcat có thể là Cơ chế ghi đè tiêu chuẩn được xác nhận được hỗ trợ trong Java và Tomcat.-Djava.endorsed.dirs=$JAVA_ENDORSED_DIRS

Xem tại đây, tôi nghĩ rằng nó được áp dụng cho các phiên bản cũ của Tomcat: http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html#XML_Parsers_and_Java.

+1

Tôi biết rằng việc triển khai SAAJ phải ở trong CXF, nhưng cách sử dụng nó? Những lọ để sử dụng? (tốt, không cần phải đặt chúng vào 'xác nhận' khi tôi sử dụng IBM JDK, mà không được đóng gói với SAAJ). –

+0

Đã một vài năm nhưng tôi phải làm điều gì đó tương tự trên Websphere. lật bộ nạp lớp cho phụ huynh cuối cùng và phải bao gồm một số lọ chính xung đột với dịch vụ web của tôi. Tôi không thể nhớ những cái lọ chính xác mà tôi phải bao gồm. Tôi bắt đầu với thời gian chạy jaxp và phải chạy ngược lại trong một quá trình loại bỏ. – TechTrip

+0

Tôi nghĩ rằng, tôi đã tìm thấy sự chấp thuận của lý thuyết của tôi :) Kiểm tra câu trả lời của tôi. –

Các vấn đề liên quan