2012-06-19 24 views
21

Tôi phải trưng ra một lớp dịch vụ ejb thông qua jax-ws.cách thay thế XmlGregorianCalendar theo Ngày?

Tôi đã tạo dịch vụ web bằng cách sử dụng jax-w và wsimport nhưng tôi bị dừng lại bởi một điều kỳ lạ; Ngày đang được ánh xạ tới XmlGregorianCalendar. Có thể sử dụng ngày java cổ điển thay thế không? Bạn có thể chỉ cho tôi đúng cách để tiếp tục không?

Cảm ơn. Chỉnh sửa: tệp ràng buộc này tôi đã sử dụng: cảm ơn, tôi đã sửa đổi một chút xml của bạn và đính kèm nó với netbeans vào webservice của ứng dụng khách và nó hoạt động. Điều này ràng buộc tôi đã sử dụng:

<jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema" 
       xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 

           xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 

           xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 

           xmlns:xsd="http://www.w3.org/2001/XMLSchema" wsdlLocation="../wsdl/localhost_8080/web_test/Testor.wsdl" > 


<jaxb:globalBindings> 
      <jaxb:javaType name="java.util.Date" 
     xmlType="xsd:dateTime" 
     parseMethod="lol.XsdDateTimeConverter.unmarshal" 
     printMethod="lol.XsdDateTimeConverter.marshalDateTime"   
      /><jaxb:javaType 
     name="java.util.Date" 
     xmlType="xsd:date" 
     parseMethod="lol.XsdDateTimeConverter.unmarshal" 
     printMethod="lol.XsdDateTimeConverter.marshalDate" 
     /> 
     </jaxb:globalBindings> 


</jaxws:bindings> 

Trả lời

19

Không được kiểm tra, nhưng sẽ hoạt động. Đầu tiên tạo ra lớp như:

import javax.xml.bind.DatatypeConverter; 

public class XsdDateTimeConverter { 

    public static Date unmarshal(String dateTime) { 
     return DatatypeConverter.parseDate(dateTime).getTime(); 
    } 

    public static String marshalDate(Date date) { 
     final GregorianCalendar calendar = new GregorianCalendar(); 
     calendar.setTime(date); 
     return DatatypeConverter.printDate(calendar); 
    } 

    public static String marshalDateTime(Date dateTime) { 
     final GregorianCalendar calendar = new GregorianCalendar(); 
     calendar.setTime(dateTime); 
     return DatatypeConverter.printDateTime(calendar); 
    } 

} 

Sau đó thêm này để tùy chỉnh xjb file:

<javaType 
     name="java.util.Date" 
     xmlType="xs:dateTime" 
     parseMethod="XsdDateTimeConverter.unmarshal" 
     printMethod="XsdDateTimeConverter.marshalDateTime" 
     /> 
<javaType 
     name="java.util.Date" 
     xmlType="xs:date" 
     parseMethod="XsdDateTimeConverter.unmarshal" 
     printMethod="XsdDateTimeConverter.marshalDate" 
     /> 
</globalBindings> 

Không thử nghiệm, nhưng nên làm việc. Dựa trên câu trả lời của tôi ở đây: JAX-WS and Joda-Time?

+0

vĩ đại giải pháp, cảm ơn! –

+0

Hey Tomasz Tôi đã thử giải pháp của bạn và tôi đã thực sự tạo ra các nguồn bằng cách sử dụng plugin maven. Nó đã tạo ra tất cả các nguồn cần thiết và nó đã tạo ra Date thay vì XMLGregorianCalendar và nó cũng được chú thích với @XmlJavaTypeAdapter (Adapter2 .class) @XmlSchemaType (name = "date") protected Date closedDate; nhưng vấn đề của tôi là nó không thể tìm thấy XsdDateTimeConverter trong các lớp bộ điều hợp và có một lỗi biên dịch. Bạn có thể giúp tôi về điều này không. – ROCKY

+0

Cùng một vấn đề ở đây. – Lyth

1

Cảm ơn Tomasz. Giải pháp trên hoạt động.
Nhưng wsimport cũng thêm bộ Adapters của nó như Adapter1.java và Adapter2.java với gói của nó org.w3._2001.xmlschema, thực sự không khớp với cấu trúc gói của riêng tôi.

Tôi đã tìm thấy cách thay đổi tên gói này bằng cách sử dụng một ràng buộc jaxb khác. Trên thực tế, tôi đã tìm kiếm điều này rất nhiều và không thể tìm thấy điều này một cách dễ dàng, vì vậy tôi thêm nó ở đây cho bất cứ ai tìm kiếm như vậy.

Thêm liên kết sau vào wsimport bằng cách sử dụng '-b binding.xml'. Lưu ý rằng wsimport có thể hoạt động với nhiều tệp ràng buộc.

binding.xml nội dung dưới đây:

<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    jaxb:version="2.0"> 
    <annotation><appinfo> 
    <jaxb:schemaBindings> 
     <jaxb:package name="com.abc.xyz.utils"/> 
    </jaxb:schemaBindings> 
    </appinfo></annotation> 
</schema> 
Các vấn đề liên quan