JAXB конструктор инъекций - PullRequest
5 голосов
/ 23 июля 2010

Я хотел бы знать, как я могу заставить компилятор JAXB сделать определенные элементы в моей XML-схеме объявленными как final в определении класса java, и я также хотел бы иметь возможность управлять различными конструкторами, как я хотел быконструктор, который может создать объект с полным списком параметров, содержащихся в классе, а также закрытый конструктор по умолчанию, необходимый JAXB.

Любая помощь?

Спасибо.

Вот пример того, что я пытаюсь сделать:

<xs:complexType name="mycomplex">
    <xs:all>
        <xs:element name="myboolean" type="xs:boolean"/>
    </xs:all>
</xs:complexType>

теперь сгенерированный код будет выглядеть примерно так:

public class mycomplex
{
        protected boolean myboolean;

        public boolean getMyboolean() { return myboolean; }
        public void setMyboolean(boolean b) { this.myboolean = b; }
}

, но я хотел бы отредактировать схему, чтобы сделать еевыглядит так:

public class mycomplex
{
        protected final boolean myboolean;

        public mycomplex(boolean b) { this.myboolean = b; }

        public boolean getMyboolean() { return myboolean; }
}

Можно ли этого достичь?

Ответы [ 3 ]

0 голосов
/ 28 июля 2010

Я решил это по-другому.Я создаю инструмент, который будет редактировать файлы исходного кода Java и добавлять / удалять то, что мне нужно.Обратитесь к этому для получения дополнительной информации: Использование Eclipse AST

0 голосов
/ 19 августа 2010

У меня похожая проблема, и я нашел следующую библиотеку: http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#immutable

И теперь все выглядит так просто;)

0 голосов
/ 26 июля 2010

Не существует стандартного способа JAXB для генерации такого класса, потому что спецификация JAXB не поддерживает сопоставление с таким классом.

Вы можете использовать следующий код, чтобы избежать использования метода set. Вы можете добавить дополнительные конструкторы, если хотите, если есть общедоступный конструктор по умолчанию.

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

@XmlAccessorType(XmlAccessType.FIELD)
public class mycomplex    
{    
        protected final boolean myboolean;    

        public boolean getMyboolean() { return myboolean; }    
}    

Если вы хотите использовать класс, который вы описали выше, с конструктором не по умолчанию и полем, помеченным как final, вам потребуется создать XmlAdapter:

...