Я разрабатываю 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);
}
}
}
Что вы имеете в виду, адаптированной LocalDateTime? У меня уже есть XmlSchemaType. Что я должен делать? И да, я попробовал XMLAdapter на стороне сервера: XmlAdapter (я забыл поместить его в сообщение) –
@AttilaKuti - Вероятно, проще всего держать этот вопрос в стороне на стороне сервера и удалять аспекты клиента (или сделайте свой вопрос). –
Да, это немного сложно, но важно и важно, что мне нужно/хотелось бы развить сервер и клиента вместе! Если я изменю WS, он будет немедленно передан клиенту (безопасный тип) ... или он должен быть, но он каким-то образом не работает с java.time (.localdate) ... –