JAXB @XmlSchema 位置被忽略
JAXB @XmlSchema location ignored
我正在尝试使用 JAXB 生成 sitemap.xml,但忽略了位置属性(我想在我的根元素上生成 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 annotation use with jaxb and How to generate the correct sitemap namespace using JAXB and Spring @ResponseBody in controller?
但是这些都不能解决我遇到的 注释 问题。
我有以下包裹信息:
@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
然而,我的单元测试:
@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..")
显式设置位置,那么它将被填充 - 但我想了解为什么它不能使用注释。
Note to implementor [...]
However, the schema generator is allowed to
use a different value in the schemaLocation attribute (including not
generating such attribute), for example so that the user can specify a
local copy of the resource through the command line interface.
所以是否生成位置取决于实施提供者。
我正在尝试使用 JAXB 生成 sitemap.xml,但忽略了位置属性(我想在我的根元素上生成 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 annotation use with jaxb and How to generate the correct sitemap namespace using JAXB and Spring @ResponseBody in controller?
但是这些都不能解决我遇到的 注释 问题。
我有以下包裹信息:
@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
然而,我的单元测试:
@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..")
显式设置位置,那么它将被填充 - 但我想了解为什么它不能使用注释。
Note to implementor [...]
However, the schema generator is allowed to use a different value in the schemaLocation attribute (including not generating such attribute), for example so that the user can specify a local copy of the resource through the command line interface.
所以是否生成位置取决于实施提供者。