Используете JAXB с JgraphX?

У меня есть некоторые сущности, сопоставленные с аннотациями JAXB, чтобы превратить их в xml, но внутри этих сущностей mxCell есть объект, как я могу отобразить этот объект, не добавляя аннотации в библиотеку кода JgraphX?

Есть мой класс Objeto:

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
@XmlSeeAlso({mxCell.class})
public abstract class ObjetoImpl implements Serializable, Objeto {

    @XmlAttribute
    protected String nome;

    @XmlAnyElement    
    protected mxCell cell;


    @Override
    public String toString() {
        return this.nome;
    }
}

Это даст мне следующее исключение:

 com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
com.mxgraph.model.mxICell is an interface, and JAXB can't handle interfaces.
    this problem is related to the following location:
        at com.mxgraph.model.mxICell
        at public com.mxgraph.model.mxICell com.mxgraph.model.mxCell.getParent()
        at com.mxgraph.model.mxCell
        at @javax.xml.bind.annotation.XmlSeeAlso(value=[class com.mxgraph.model.mxCell])
        at ardis.model.conceitual.atributo.Atributo
        at protected java.util.List ardis.model.conceitual.ObjetoWithAttributeImpl.attributes
        at ardis.model.conceitual.ObjetoWithAttributeImpl
        at ardis.model.conceitual.entidade.Entidade
        at @javax.xml.bind.annotation.XmlSeeAlso(value=[class ardis.model.conceitual.entidade.Entidade])
        at ardis.model.conceitual.ModeloConceitual

Это исключение возникает, когда реализация интерфейса неправильно сопоставлена ​​с Jaxb, но я не хочу входить в библиотеку jgraphx и изменять ее

2 ответа

Решение

Я не мог преобразовать объекты программы, у которых внутри был mxCell, используя JAXB, поэтому для меня решение было использовать JgraphX ​​"getXml" для преобразования элементов графа и значений каждой ячейки. После этого я получаю значение ячеек и использую его в своем коде.

Код для передачи графика в xml:

        mxCodec codec = new mxCodec();


    String xml = mxXmlUtils.getXml(codec.encode(graph.getModel()));

Есть несколько способов справиться с этим вариантом использования:


Вариант № 1 - Укажите класс Impl с помощью @XmlElement

Для полей / свойств, которые имеют тип интерфейса, можно использовать @XmlElement аннотация для указания конкретной реализации.

@XmlElemen(type=mxCellImpl.class)    
protected mxCell cell;

Для дополнительной информации


Вариант № 2 - использовать XmlAdapter

XmlAdapter позволяет вам преобразовать не отображаемый объект в сопоставляемый во время процесса маршалинга / демаршаллинга. Вы можете использовать это для конвертации JgraphX в свой собственный объект домена.

Для дополнительной информации

Другие вопросы по тегам