2014-09-04 16 views
1

Я разрабатываю NetBeans (8) JAXWS (Развернутый на Glassfish 4.0) в модуле EJB и клиенте JAVAFX. Я строю свой WS из классов классов Java с помощью IDE. Я борюсь с , передавая java.time.LocalDateTime через WS и получая LocalDateTime в клиенте.@XmlJavaTypeAdapter vs @XmlSchemaType с java.time.LocalDateTime

Важно, чтобы я хотел/хотел бы разработать сервер и клиент вместе! Если я изменил WS, WSDL изменится, он должен быть распространен Netbeans (через JAXWS) на клиентский исходный код сразу (безопасный тип) ..., но он каким-то образом не работает с java.time (.localdate).

В то же время WS не пишет ничего в поля LocalDateTime во время сортировки. Зачем? Это хороший метод, который я использую? Пропустить что-нибудь? Благодарю.

Если я использую @XmlJavaTypeAdapter в WebService для обработки LocalDateTime маршалинга в строку, генерация XSD ставит хз: строку в моих LocalDateTime полеи ... так @XMLSchemaType будет перекрываться @XmlJavaTypeAdapter. Как я могу это решить?

На стороне Sever, в WebService, я использую уровень пакетов

@XmlSchemaTypes({ 
     @XmlSchemaType(name="date", type=LocalDate.class) 
     ,@XmlSchemaType(name="dateTime", type=LocalDateTime.class) 
     ,@XmlSchemaType(name="time", type=LocalTime.class) 
    }) 

Это делает IDE генерировать правильные элементы XSD, например, содержащий

<xs:element name="validTo" type="xs:dateTime" minOccurs="0"/> 

В XMLAdapter на сервере: (Если я впрыснуть его с @XmlJavaTypeAdapter (String, LocalDateTime), то генерация XSD создает строку из LocalDateTime.)

public class LocalDateTimeAdapter 
     extends XmlAdapter<String, LocalDateTime>{ 
     @Override 
     public LocalDateTime unmarshal(String v) throws Exception { 
      return LocalDateTime.parse(v,DateTimeFormatter.ISO_LOCAL_DATE_TIME); 
     } 
     @Override 
     public String marshal(LocalDateTime v) throws Exception { 
      return v.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); 
     } 
    } 

На Клиентская сторона, Я подключил WS, дайте среде IDE генерировать классы. Я добавил внешний связывания файла к прилагаемым Webservice и адаптер класс для обработки LocalDateTime полей:

Binding файл:

  <jxb:globalBindings> 
       <jxb:javaType name="java.time.LocalDateTime" xmlType="xs:dateTime" 
         parseMethod="test.app.utils.JaxBDateConverter.parseDateTime" 
         printMethod="test.app.utils.JaxBDateConverter.printDateTime" /> 
       <jxb:javaType name="java.time.LocalDate" xmlType="xs:date" 
         parseMethod="test.app.utils.JaxBDateConverter.parseDate" 
         printMethod="test.app.utils.JaxBDateConverter.printDate" /> 
       <jxb:javaType name="java.time.LocalTime" xmlType="xs:time" 
         parseMethod="test.app.utils.JaxBDateConverter.parseTime" 
         printMethod="test.app.utils.JaxBDateConverter.printTime" /> 

      </jxb:globalBindings> 

     </jxb:bindings> 
    </jxb:bindings> 

класс адаптера на клиенте: пакет test.app.client;

import java.time.LocalDate; 
    import java.time.LocalDateTime; 
    import java.time.LocalTime; 
    import java.time.format.DateTimeFormatter; 

    public class JaxBDateConverter { 

    static final DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_DATE_TIME; 
    static final DateTimeFormatter df = DateTimeFormatter.ISO_LOCAL_DATE; 
    static final DateTimeFormatter tf = DateTimeFormatter.ISO_LOCAL_TIME; 

    public static LocalDateTime parseDateTime(String s) { 
     try { 
      if (s.trim().isEmpty()) { 
       return null; 
      } else { 
      } 
      LocalDateTime r = LocalDateTime.parse(s, dtf); 
      return r; 
     } catch (Exception e) { 
      throw new IllegalArgumentException(e); 
     } 
    } 

    public static String printDateTime(LocalDateTime d) { 
     try { 
      if (d == null) 
       return null; 
      return d.format(dtf); 
     } catch (Exception e) { 
      throw new IllegalArgumentException(e); 
     } 
    } 

    public static LocalDate parseDate(String s) { 
     try { 
      if (s.trim().isEmpty()) { 
       return null; 
      } else { 
      } 
      LocalDate r = LocalDate.parse(s, df); 
      return r; 
     } catch (Exception e) { 
      throw new IllegalArgumentException(e); 
     } 
    } 

    public static String printDate(LocalDate d) { 
     try { 
      if (d == null) 
       return null; 
      return d.format(df); 
     } catch (Exception e) { 
      throw new IllegalArgumentException(e); 
     } 
    } 
    public static LocalTime parseTime(String s) { 
     try { 
      if (s.trim().isEmpty()) { 
       return null; 
      } else { 
      } 
      LocalTime r = LocalTime.parse(s, tf); 
      return r; 
     } catch (Exception e) { 
      throw new IllegalArgumentException(e); 
     } 
    } 

    public static String printTime(LocalTime d) { 
     try { 
      if (d == null) 
       return null; 
      return d.format(tf); 
     } catch (Exception e) { 
      throw new IllegalArgumentException(e); 
     } 
    } 

    } 

ответ

0

Somewhy WS ничего в LocalDateTime полей не писать во сортировочных. Зачем? Это хороший метод, который я создал? Пропустить что-то? Благодарю.

java.time.LocalDateTime типа были добавлены с момента последней JAXB (JSR-222) был выпущен поэтому сейчас вам требуется XmlAdapter обрабатывать преобразование.


Если я использую @XmlJavaTypeAdapter в WebService для обработки LocalDateTime маршалинга, генерация XSD ставит хз: строку в моих поля LocalDateTime ... так @XMLSchemaType будет перекрытый по @XmlJavaTypeAdapter. Как я могу решить это?

@XmlJavaTypeAdapter не отменяет @XmlSchemaType. Вместо этого ссылочный XmlAdapter преобразует LocalDateTime в String. Теперь далеко, поскольку JAXB обеспокоен тем, что теперь это свойство String, поэтому @XmlSchemaType больше не применяется.


Как я могу решить эту проблему?

Вы можете использовать аннотацию @XmlSchemaType непосредственно на адаптированном объекте LocalDateTime.

@XmlJavaTypeAdapter(LocalDateTimeAdapter.class) 
@XmlSchemaType(name="dateTime") 
public LocalDateTime getMyLocalDateTime() { 
    return myLocalDateTime; 
} 
+0

Что вы имеете в виду, адаптированной LocalDateTime? У меня уже есть XmlSchemaType. Что я должен делать? И да, я попробовал XMLAdapter на стороне сервера: XmlAdapter (я забыл поместить его в сообщение) –

+0

@AttilaKuti - Вероятно, проще всего держать этот вопрос в стороне на стороне сервера и удалять аспекты клиента (или сделайте свой вопрос). –

+0

Да, это немного сложно, но важно и важно, что мне нужно/хотелось бы развить сервер и клиента вместе! Если я изменю WS, он будет немедленно передан клиенту (безопасный тип) ... или он должен быть, но он каким-то образом не работает с java.time (.localdate) ... –

Смежные вопросы