JAXB @XmlSchema местоположение игнорируется

1

Я пытаюсь создать sitemap.xml с помощью JAXB, и атрибут location игнорируется (я хочу сгенерировать xsi:schemaLocation на моем корневом элементе).

Я хочу создать xml следующим образом:

<?xml version="1.0" encoding="UTF-8" ?>
<ns3:urlset 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ns3="http://www.sitemaps.org/schemas/sitemap/0.9"
    xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
        http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
    <urls>
        <loc>http://domain.com</loc>
    </urls>
    <urls>
        <loc>http://domain.com/test</loc>
    </urls>
</ns3:urlset>

Я видел другие вопросы: использование @xmlSchema аннотации с jaxb и Как создать правильное пространство имен sitemap, используя JAXB и Spring @ResponseBody в контроллере?

Но ни одна из них не решает проблему, которую я испытываю с помощью аннотации.

У меня есть следующая информация о пакете:

@javax.xml.bind.annotation.XmlSchema(
    namespace = "http://www.sitemaps.org/schemas/sitemap/0.9",
    xmlns = @javax.xml.bind.annotation.XmlNs( prefix = "xsi", namespaceURI="http://www.w3.org/2001/XMLSchema-instance" ),
    location = "http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd",
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED
)
package com.domain.site.sitemap

Однако мой unit тест:

@Test public void createXmlObject(){
    List urls = [ "test1", "test2", "test3" ]
    Sitemap map = new Sitemap( urls )
    JAXBContext jaxbContext = JAXBContext.newInstance( Sitemap )
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller()
    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true)
    jaxbMarshaller.marshal(map, System.out)
}

генерирует корневой элемент следующим образом:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns3:urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns3="http://www.sitemaps.org/schemas/sitemap/0.9">

Если я обновляю тест, чтобы явно установить местоположение, используя jaxbMarshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "location..") тогда он будет заполнен, но я хочу понять, почему он не работает с аннотацией.

Теги:
groovy
jaxb

1 ответ

1
Лучший ответ

Согласно спецификации:

Примечание для разработчика [...]

Однако генератору схемы разрешено использовать другое значение в атрибуте schemaLocation (включая не генерирование такого атрибута), например, так, чтобы пользователь мог указать локальную копию ресурса через интерфейс командной строки.

Таким образом, это зависит от поставщика реализации, если оно создано или нет.

  • 0
    Спасибо - я заметил это в документах, но так как мой тест просто использует простой JAXB (JAXBContenxt создает javax.xml.bind.Marshaller), я надеялся, что они бы это реализовали - я предполагаю, что это не так?
  • 1
    Похоже, no . Пытался углубиться в источники, но это заняло слишком много времени.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню