У меня есть Java bean:
@NoArgsConstructor
@Data
@EqualsAndHashCode(callSuper = false)
@XmlRootElement(name = "AUTORIZZATI")
@XmlAccessorType(XmlAccessType.FIELD)
public final class Authorization extends XmlAdapter<ArrayList<Authorization.Event>, HashMap<Integer, Authorization.Event>> implements Serializable
{
@XmlAttribute(name = "SUBISO")
private String subIso;
@XmlElement(name = "EVENTO")
@XmlJavaTypeAdapter(MyAdapter.class)
private HashMap<Integer, Authorization.Event> events;
}
Это класс MyAdapter:
@Override
public final ArrayList<Event> marshal(final HashMap<Integer, Event> v) throws Exception
{
return new ArrayList<>(v.values());
}
@Override
public final HashMap<Integer, Event> unmarshal(final ArrayList<Event> v) throws Exception
{
return new HashMap<>(v.stream().collect(Collectors.toMap(Event::getId, item -> item)));
}
Событие - это еще один bean-компонент, который корректно не маршалируется, если член "events" Список и без адаптера, вот так:
private List<Authorization.Event> events;
Он работает даже с абстрактными типами, но не с адаптером Xml (выдает ошибку, говорящую, что тип должен быть конкретным).
Почему мой адаптер не работает? Если я напечатаю аргумент "v" внутри метода "unmarshal", он покажет пустой список (не ноль!). Но если я не включаю какой-либо адаптер в элемент «events», а типом является List (абстрактный), то специализированным типом является «ArrayList» !!!
Почему это происходит? Я не вижу ничего плохого здесь! Заранее спасибо!