Неспособный маршалировать тип как элемент, потому что отсутствует аннотация @XmlRootElement для автоматически сгенерированных классов
Мне нужно проверить объект класса против моей схемы, в которой я предоставил регулярное выражение для проверки полей для автоматически созданных классов JAXB. Когда я пытаюсь проверить свой объект класса, я получаю ниже ошибки:
не удалось маршалировать тип "xyz" как элемент, потому что отсутствует аннотация @XmlRootElement
Вот код, который я использую для проверки объекта автогенерируемого класса:
jc = JAXBContext.newInstance(obj.getClass());
source = new JAXBSource(jc, obj);
Schema schema = schemaInjector.getSchema();
Validator validator = schema.newValidator();
validator.validate(source);
Есть ли другой способ решить эту проблему?
Ответы
Ответ 1
Если ваш класс не имеет аннотации @XmlRootElement
, вы можете обернуть его в экземпляр JAXBElement
. Если вы сгенерировали свои классы из XML-схемы, то сгенерированный ObjectFactory
может иметь удобный метод для вас.
Я написал больше об этом случае использования в своем блоге:
Ответ 2
Я предлагаю вам использовать плагин maven "maven-plugin-jaxb2" для генерации классов из XSD. Используйте файл привязки *. xjb для добавления аннотаций @XmlRootElement.
После некоторого примера
например, файл привязки
<bindings version="2.0" xmlns="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:annox="http://annox.dev.java.net">
<globalBindings>
<xjc:serializable uid="12343" />
<xjc:simple/>
</globalBindings>
</bindings>
например, плагин Maven
http://confluence.highsource.org/display/MJIIP/User+Guide
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.8.1</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<args>
<arg>-Xannotate</arg>
<arg>-nv</arg>
</args>
<extension>true</extension>
<forceRegenerate>true</forceRegenerate>
<bindingDirectory>${basedir}/src/main/resources/schema/xjb</bindingDirectory>
<bindingIncludes>
<include>*.xjb</include>
</bindingIncludes>
<schemas>
<schema>
<fileset>
<directory>${basedir}/src/main/resources/schema/</directory>
<includes>
<include>*.xsd</include>
</includes>
</fileset>
</schema>
</schemas>
<debug>true</debug>
<verbose>true</verbose>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.6.2</version>
</plugin>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics-annotate</artifactId>
<version>0.6.2</version>
</plugin>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-namespace-prefix</artifactId>
<version>1.1</version>
</plugin>
</plugins>
</configuration>
</plugin>
Ответ 3
Я столкнулся с той же проблемой из-за устаревшего wsdl, который не имеет схемы xsd внутри определения wsdl. Я решил эту проблему, имея два подключаемых модуля maven для генерации операций из wsdl, а также DTD из файла xsd, как new ObjectFactory().createHandShake(new HandShake());
ниже, и для упорядочивания new ObjectFactory().createHandShake(new HandShake());
public boolean handShake() {
JAXBElement<HandShake> request = new ObjectFactory().createHandShake(new HandShake());
logger.info(String.format("request: {0}", "handshake request"));
logger.debug("sending request");
HandShakeResponse handShakeResponse = ((JAXBElement<HandShakeResponse>) getWebServiceTemplate()
.marshalSendAndReceive(request, new SoapActionCallback(
"urn:handShake"))).getValue();
logger.debug("receive response");
return handShakeResponse.isReturn();
}
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.14.0</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaLanguage>WSDL</schemaLanguage>
<generatePackage>${contextPathWSDL}</generatePackage>
<schemas>
<schema>
<url>${merchant.WSDL}</url>
</schema>
</schemas>
</configuration>
</plugin>
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.14.0</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaDirectory>${basedir}/src/main/resources/xsds</schemaDirectory>
<schemaIncludes>
<include>*.xsd</include>
</schemaIncludes>
<generatePackage>${contextPathXSD}</generatePackage>
<generateDirectory>${basedir}/target/generated-sources/DTD</generateDirectory>
</configuration>
</plugin>