Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JAXB: shemaLocation / 2 сообщений из 2, страница 1 из 1
29.09.2016, 13:38
    #39317797
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB: shemaLocation
всем привет.

мне надо в генерируемом xml-файле получить в корневом елементе аттрибут shemaLocation. Результат должен выглядеть так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<Transformation 
xmlns="http://www.tibco.com/schemas/TransformationDataModel/V02" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tibco.com/schemas/TransformationDataModel/V02 ../xsd/TransformationDataModel_V02.xsd">

    <TargetRootName>
        <RootName>root name</RootName>
        <NamespaceUri>test name space</NamespaceUri>
    </TargetRootName>
</Transformation>



но получается только так:
Код: xml
1.
2.
3.
4.
5.
6.
<Transformation xmlns="http://www.tibco.com/schemas/TransformationDataModel/V02">
    <TargetRootName>
        <RootName>root name</RootName>
        <NamespaceUri>test name space</NamespaceUri>
    </TargetRootName>
</Transformation>



Исходная ситуация такая.
В мавен проекте имеется некий TransformationDataModel_V02.xsd
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
	 xmlns="http://www.tibco.com/schemas/TransformationDataModel/V02"
	 targetNamespace="http://www.tibco.com/schemas/TransformationDataModel/V02"
	 elementFormDefault="qualified"
	 attributeFormDefault="unqualified">
	 
	<xs:element name="Transformation">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="TargetRootName" type="xs:string"/>
				<xs:element ref="Mapping" minOccurs="0" maxOccurs="unbounded" />
			</xs:sequence>
		</xs:complexType>
	</xs:element>
.....
</xs:schema>


При помощи плагина:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
<plugin>
				<groupId>org.jvnet.jaxb2.maven2</groupId>
				<artifactId>maven-jaxb2-plugin</artifactId>
				<configuration>
					<schemaDirectory>src/main/resources</schemaDirectory>
					<schemaIncludes>
						<include>*.xsd</include>
					</schemaIncludes>
					<generatePackage>com.ciber.tibco.xslt.mapper.V02.jaxb</generatePackage>
	              	<args>
	                    <arg>-XtoString</arg>
	                    <arg>-Xequals</arg>
	                    <arg>-XhashCode</arg>
	                </args>
	                <plugins>
	                    <plugin>
	                        <groupId>org.jvnet.jaxb2_commons</groupId>
	                        <artifactId>jaxb2-basics</artifactId>
	                        <version>0.6.4</version>
	                    </plugin>
	                </plugins>
				</configuration>
				<executions>
					<execution>
						<id>generate entity classes from xsd schema</id>
						<goals>
							<goal>generate</goal>
						</goals>
					</execution>
				</executions>

			</plugin>


я получаю нужные классы, а так же package-info.java
Код: java
1.
2.
3.
4.
5.
@javax.xml.bind.annotation.XmlSchema(
		namespace = "http://www.tibco.com/schemas/TransformationDataModel/V02", 
		elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED
		)
package com.ciber.tibco.domain;


Далее после обработки я должен получить xml-структуру Transformation вместе с атрибутом "xsi:schemaLocation", но этого не происходит.
Аннотация @javax.xml.bind.annotation.XmlSchema имеет переменную location, но она к сожалению на процесс генерации вообще никакого влияния не оказывает, т.е.
Код: java
1.
2.
3.
4.
5.
6.
@javax.xml.bind.annotation.XmlSchema(
		namespace = "http://www.tibco.com/schemas/TransformationDataModel/V02", 
		location = "http://www.tibco.com/schemas/TransformationDataModel/V02 ../xsd/TransformationDataModel_V02.xsd",
		elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED
		)
package com.ciber.tibco.domain;

не работает вообще.

В идеале для меня было бы решение, при котором мавен-плагин считывал schemaLocation и сохранял её где-нибудь. Я думал (рассчитывал), что "где-нибудь" это info-package.java.

Единственное решение, которое я нашел имеет вид:
Код: 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.
25.
26.
public class Demo {

	public static void main(String[] args) throws Exception {
       JAXBContext ctx = JAXBContext.newInstance(Transformation.class);

       Transformation root = new Transformation();
       TargetRootName targetRootName=new TargetRootName();
       targetRootName.setNamespaceUri("test name space");
       targetRootName.setRootName("root name");
       root.setTargetRootName(targetRootName);

        Marshaller m = ctx.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        m.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.tibco.com/schemas/TransformationDataModel/V02 ../xsd/TransformationDataModel_V02.xsd");
        
        try {
            m.setProperty("com.sun.xml.bind.namespacePrefixMapper", new MyNamespaceMapper());
        } catch(PropertyException e) {
            // In case another JAXB implementation is used
        	e.printStackTrace();
        }
        
        m.marshal(root, System.out);
	}

}


Но оно не устраивает, потому что в случае изменения SchemaLocation придется лезть и менять код приложения.

Пожалуйста подскажите, может есть другое решение ?
...
Рейтинг: 0 / 0
29.09.2016, 14:38
    #39317868
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB: shemaLocation
простите коллеги, чистая запарка.

аттрибут schemaLocation, который я думал находится в схеме - это "запарка".
schemaLocation это независимый аттрибут и вставляется руками, т.е. в коде или через файл свойств.

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


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