У меня возникла проблема с тем, как JAXB создает связанные классы для XML-схемы (которая, ради точности, я не могу изменить). Я хочу сопоставить xsd: тип даты с объектом LocalDate для Joda-времени и, прочитав здесь, здесь и здесь, я создал следующий класс DateAdapter:
public class DateAdapter extends XmlAdapter<String,LocalDate> {
private static DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyyMMdd");
public LocalDate unmarshal(String v) throws Exception {
return fmt.parseLocalDate(v);
}
public String marshal(LocalDate v) throws Exception {
return v.toString("yyyyMMdd");
}
}
И я добавил в свой глобальный файл привязки следующее:
<jaxb:globalBindings>
<jaxb:javaType name="org.joda.time.LocalDate" xmlType="xs:date"
parseMethod="my.classes.adapters.DateAdapter.unmarshal"
printMethod="my.classes.adapters.DateAdapter.marshal" />
</jaxb:globalBindings>
Проблема в том, что когда я пытаюсь скомпилировать мой проект maven, он терпит неудачу со следующей ошибкой:
[ERROR] \My\Path\MyProject\target\generated-sources\xjc\my\classes\generated\Adapter1.java:[20,59] non-static method unmarshal(java.lang.String) cannot be referenced from a static context
[ERROR] \My\Path\MyProject\target\generated-sources\xjc\my\classes\generated\Adapter1.java:[24,59] non-static method marshal(org.joda.time.LocalDate) cannot be referenced from a static context
... и здесь все становится странно. JAXB создает класс Adapter1, который содержит следующее:
public class Adapter1
extends XmlAdapter<String, LocalDate>
{
public LocalDate unmarshal(String value) {
return (my.classes.adapters.DateAdapter.unmarshal(value));
}
public String marshal(LocalDate value) {
return (my.classes.adapters.DateAdapter.marshal(value));
}
}
.... который является источником ошибки компиляции.
Теперь мои вопросы:
- то, что мой адаптер переопределяет XmlAdapter, я не могу сделать методы статическими.... как этого избежать?
- Можно ли вообще избежать создания класса Adapter1.class? Возможно, используя аннотацию на уровне пакета XmlJavaTypeAdapters, и если да, то как мне это сделать точно? (JAXB генерирует уже собственный package.info.java.)
Надеюсь, я сделал свою ситуацию ясной.
Благодаря