Ответ 1
Когда реализация JAXB (JSR-222) инициализирует свои метаданные, она гарантирует, что она может поддерживать как маршаллинг, так и безмаршаллинг.
Для классов POJO, у которых нет конструктора no-arg, вы можете использовать тип уровня XmlAdapter
для его обработки:
java.sql.Date
не поддерживается по умолчанию (хотя в EclipseLink JAXB (MOXy) он есть). Это также можно обрабатывать с помощью XmlAdapter
, указанного через @XmlJavaTypeAdapter
на уровне поля, свойства или пакета:
- http://blog.bdoughan.com/2011/05/jaxb-and-joda-time-dates-and-times.html
- http://blog.bdoughan.com/2011/01/jaxb-and-datetime-properties.html
Кроме того, еще один nit, почему реализация Java JAXB исключение, если поле имеет значение NULL и не собирается сортироваться в любом случае?
Какое исключение вы видите? Обычно, когда поле является нулевым, оно не включается в результат XML, если оно не аннотируется с @XmlElement(nillable=true)
, и в этом случае элемент будет включать xsi:nil="true"
.
UPDATE
Вы можете сделать следующее:
SqlDateAdapter
Ниже приведено XmlAdapter
, которое преобразует из java.sql.Date
, что ваша реализация JAXB не знает, как обращаться с java.util.Date
, который она выполняет:
package forum9268074;
import javax.xml.bind.annotation.adapters.*;
public class SqlDateAdapter extends XmlAdapter<java.util.Date, java.sql.Date> {
@Override
public java.util.Date marshal(java.sql.Date sqlDate) throws Exception {
if(null == sqlDate) {
return null;
}
return new java.util.Date(sqlDate.getTime());
}
@Override
public java.sql.Date unmarshal(java.util.Date utilDate) throws Exception {
if(null == utilDate) {
return null;
}
return new java.sql.Date(utilDate.getTime());
}
}
Foo
XmlAdapter
регистрируется посредством аннотации @XmlJavaTypeAdapter
:
package forum9268074;
import java.sql.Date;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement(name = "Foo")
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {
int i;
@XmlJavaTypeAdapter(SqlDateAdapter.class)
Date d; //java.sql.Date does not have a no-arg constructor
}