2011-08-10 4 views
10

Tôi đang sử dụng Apache CXF để tạo các lớp từ tệp WSDL nhưng chúng không triển khai Serializable cần thiết để đặt đối tượng vào hàng đợi JMS. Có thể làm điều này hay tôi phải chuyển đổi các lớp được tạo ra thành của riêng mình và gửi các lớp đó?Có thể tạo các lớp serializable với CXF không?

Trả lời

13

Tôi tìm thấy giải pháp bản thân mình vì vậy đây nó là nếu ai cần nó trong tương lai:

1. add this plugin to pom.xml

<plugin> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-codegen-plugin</artifactId> 
    <version>${cxf.version}</version> 
    <executions> 
     <execution> 
      <id>generate-sources</id> 
      <phase>generate-sources</phase> 
      <configuration> 
       <sourceRoot>${basedir}/src/main/java</sourceRoot> 
       <wsdlRoot>${basedir}/src/main/resources</wsdlRoot> 
       <includes> 
        <include>*Service.wsdl</include> 
       </includes> 
       <wsdlOptions> 
        <wsdlOption> 
         <wsdl>${basedir}/src/main/resources/your_wsdl.wsdl</wsdl> 
         <extraargs> 
          <extraarg>-client</extraarg> 
          <extraarg>-impl</extraarg> 
          <extraarg>-server</extraarg> 
          <extraarg>-verbose</extraarg> 
          <extraarg>-validate</extraarg> 
         </extraargs> 
         <bindingFiles> 
          <bindingFile>${basedir}/src/main/resources/binding.xml</bindingFile> 
         </bindingFiles> 
        </wsdlOption> 
       </wsdlOptions> 
      </configuration> 
      <goals> 
       <goal>wsdl2java</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

2. write a custom binding (binding.xml)

<?xml version="1.0" encoding="UTF-8"?> 
<jaxws:bindings wsdlLocation="Send.wsdl" 
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <jaxws:bindings 
     node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://wsdl/SendService.wsdl']"> 
     <jxb:globalBindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
      <jxb:serializable uid="11082011"/> 
     </jxb:globalBindings> 
    </jaxws:bindings> 
</jaxws:bindings> 

3. run 'mvn generate-sources'

+2

Lưu ý rằng bạn cần phải thực hiện một vài thay đổi ở file binding.xml của bạn. 1. Hoán đổi 'Send.wsdl' trong dòng 2 thành bất kỳ tên WSDL nào của bạn, và 2. Thay thế thuộc tính' node' trong dòng 8 với bất kỳ vùng tên đích nào của bạn, như được đề xuất [ở đây] (http: // markmail. org/message/aw52wgp6bdpwo5rx) –

4

Một phiên bản đơn giản của bindings.xml, mà chắc chắn rằng tất cả các tập tin được tạo đang thực hiện Serializable:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    elementFormDefault="qualified" attributeFormDefault="unqualified" 
    jaxb:extensionBindingPrefixes="xjc" jaxb:version="2.1"> 
    <xs:annotation> 
     <xs:appinfo> 
      <jaxb:globalBindings> 
       <xjc:serializable /> 
      </jaxb:globalBindings> 
     </xs:appinfo> 
    </xs:annotation> 
</xs:schema> 
4

file Binding với < jaxws: bindings > gốc yếu tố làm việc với jaxb: globalBindings chỉ khi wsdl của bạn có một lược đồ duy nhất. Vấn đề là jaxb: globalBindings là toàn cục nên không thể chỉ định nhiều hơn một lần.

Nếu đó là trường hợp của bạn, bạn có thể sử dụng các ràng buộc sau nộp với jaxb: bindings:

<?xml version="1.0" encoding="UTF-8"?> 
<jaxb:bindings version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"> 
    <jaxb:globalBindings> 
     <jaxb:serializable uid="1"/> 
    </jaxb:globalBindings> 
</jaxb:bindings>