Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JAXB is missing an @XmlRootElement / 14 сообщений из 14, страница 1 из 1
26.11.2014, 18:26
    #38817680
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB is missing an @XmlRootElement
Всем доброго дня.
Случилась вот такая беда, достался проект с использованием JAXB. Unmarshalling работает нормально, классы генерятся нормально, вроде все хорошо. Но вот беда: Marshalling не работает.

[com.sun.istack.internal.SAXException2: unable to marshal type ... as an element because it is missing an @XmlRootElement annotation]

Куда копать? Что делать?
...
Рейтинг: 0 / 0
26.11.2014, 19:17
    #38817717
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB is missing an @XmlRootElement
danatriel,

Видать что-то не то пытаетесь маршалить. И зачем вы ваш секретный тип вырезали из сообщения об ошибке. В него ведь и надо смотреть.
...
Рейтинг: 0 / 0
27.11.2014, 11:48
    #38818222
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB is missing an @XmlRootElement
Blazkowicz, да вроде ничего секретного. Посчитал не важной информацией(
Caused by: com.sun.istack.internal.SAXException2: unable to marshal type "com.vtco.busmt.config.FederationConfigType" as an element because it is missing an @XmlRootElement annotation

вот шапка xsd
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
&#65279;<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:busmt="http://config.busmt.vtco.com"
  targetNamespace="http://config.busmt.vtco.com">
  <xsd:element name="federation-config" type="busmt:FederationConfigType" />
  <xsd:complexType name="FederationConfigType">
    <xsd:sequence>
      <xsd:element name="activemq" type="busmt:ActiveMQType" />
      <xsd:element name="redis" type="busmt:RedisType" />
      <xsd:element name="federations" type="busmt:FederationsType" />
    </xsd:sequence>
  </xsd:complexType>



шапка сгенерированного ObjectFactory:
Код: java
1.
2.
3.
4.
@XmlRegistry
public class ObjectFactory {

    private final static QName _FederationConfig_QNAME = new QName("http://config.busmt.vtco.com", "federation-config");




шапка сгенерированного FederationConfigType:
Код: java
1.
2.
3.
4.
5.
6.
7.
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "FederationConfigType", propOrder = {
    "activemq",
    "redis",
    "federations"
})
public class FederationConfigType {



Marshaller:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
    public static Marshaller getServerConfigMarshaller() {
        final Schema schema;
        try {
            final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            final URL schemaURL = Marshallers.class.getResource(SCHEMA_RESOURCE);
            if (schemaURL == null) {
                throw new Error("Fatal error: cannot locate configuration schema "
                        + "definition. Please, check your application package integrity.");
            }
            schema = sf.newSchema(schemaURL);

        } catch (final Throwable e) {
            throw new Error("Fatal error: failed to load configuration schema file.", e);
        }

        try {
            final JAXBContext context = JAXBContext.newInstance(FederationConfigType.class);
            Marshaller m=context.createMarshaller();
            m.setSchema(schema);
            return m;
        } catch (final Throwable e) {
            throw new Error("Fatal error: failed to initialize JAXB engine.", e);
        }
    }



пытаюсь маршаллить так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    public static void save() {
        Marshaller serverConfigMarshaller = Marshallers.getServerConfigMarshaller();
        try {
            serverConfigMarshaller.marshal(getFederationConfigType(), new File("d:\\1.xml"));
        } catch (JAXBException ex) {
            Logger.getLogger(InfoAgregator.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
...
Рейтинг: 0 / 0
27.11.2014, 11:53
    #38818229
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB is missing an @XmlRootElement
danatriel,

Так это же "Юпи" - просто добавь воды.
Официальная дока говорит что делать
https://docs.oracle.com/cd/E16671_01/bh.200/e16658/troubleshooting.html
Здесь объясняют почему аннотация может не генерироваться в xjc
http://stackoverflow.com/questions/819720/no-xmlrootelement-generated-by-jaxb
...
Рейтинг: 0 / 0
27.11.2014, 12:11
    #38818238
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB is missing an @XmlRootElement
Blazkowicz,

добавить вручную аннотацию нельзя, все равно при выполнении удалится аннотация. Классы при сборке заново генерятся же :(
...
Рейтинг: 0 / 0
27.11.2014, 12:14
    #38818240
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB is missing an @XmlRootElement
danatrielдобавить вручную аннотацию нельзя, все равно при выполнении удалится аннотация. Классы при сборке заново генерятся же :(
Поменяйте процесс. Либо уберите перегенерацию при сборке. Либо напишите патч, который после перегенерации накатыввает пропатченые классы сверху.
...
Рейтинг: 0 / 0
27.11.2014, 12:15
    #38818244
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB is missing an @XmlRootElement
danatriel,

Обратите внимание на этот комент. Может действительно в JAXBElement завернуть?
http://stackoverflow.com/questions/819720/no-xmlrootelement-generated-by-jaxb#comment6877098_2172942
...
Рейтинг: 0 / 0
27.11.2014, 12:17
    #38818247
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB is missing an @XmlRootElement
danatrielдобавить вручную аннотацию нельзя, все равно при выполнении удалится аннотация. Классы при сборке заново генерятся же :(
А по ссылкам пробовали ходить? Там и рецепт показан.
https://weblogs.java.net/blog/2006/03/03/why-does-jaxb-put-xmlrootelement-sometimes-not-always
...
Рейтинг: 0 / 0
27.11.2014, 12:17
    #38818248
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB is missing an @XmlRootElement
Blazkowicz,

я пробовал и в JAXBElement обертывать - результата никакого.
А никак нельзя заставить при генерации класса писать аннотацию?
...
Рейтинг: 0 / 0
27.11.2014, 12:27
    #38818253
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB is missing an @XmlRootElement
Blazkowicz,

Код: java
1.
2.
            JAXBElement<FederationConfigType> jaxbElement = new JAXBElement<>(new QName("http://config.busmt.vtco.com", "federation-config"),FederationConfigType.class,getFederationConfigType());
            serverConfigMarshaller.marshal(jaxbElement,new File("d:\\1.xml"));



так же ругается на rootElement
...
Рейтинг: 0 / 0
27.11.2014, 12:34
    #38818263
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB is missing an @XmlRootElement
danatrielя пробовал и в JAXBElement обертывать - результата никакого.
А никак нельзя заставить при генерации класса писать аннотацию?

Вы меня где-то обманывается.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.*;
import javax.xml.namespace.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Test")
public class Test {

public static void main(String[] args) throws Exception {
 JAXBContext context = JAXBContext.newInstance(Test.class);
 Marshaller m = context.createMarshaller();
 m.marshal( new JAXBElement(
  new QName("test","t"), Test.class, new Test() ), System.out);
}
}



Таки печатает XML
...
Рейтинг: 0 / 0
27.11.2014, 12:42
    #38818271
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB is missing an @XmlRootElement
Blazkowicz,
Простите за совсем глупый вопрос, но что значит ("t") new QName("test", "t" )
как я понимаю, это что-то в схеме
...
Рейтинг: 0 / 0
27.11.2014, 12:46
    #38818276
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB is missing an @XmlRootElement
danatrielBlazkowicz,
Простите за совсем глупый вопрос, но что значит ("t") new QName("test", "t" )
как я понимаю, это что-то в схеме
t - это имя тэга test это namespace.
Посмотрите ObjectFactory там будут приватные контсанты для ваших тэгов.
...
Рейтинг: 0 / 0
27.11.2014, 12:50
    #38818281
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB is missing an @XmlRootElement
Blazkowicz,

спасибо Вам огромное!!! Все заработало!!
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JAXB is missing an @XmlRootElement / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]