Generate a sitemap with Java


This code dynamically generates a sitemap in Spring Boot

@RequestMapping(value = "/sitemap.xml", method = RequestMethod.GET, 
produces = MediaType.APPLICATION_XML_VALUE) 
    @ResponseBody 
    public XmlUrlSet main() { 
        XmlUrlSet xmlUrlSet = new XmlUrlSet(); 
        create(xmlUrlSet, "", XmlUrl.Priority.HIGH); 
         
        // List<String> containing with your urls 
        urls.forEach( 
                url -> create(xmlUrlSet, url, XmlUrl.Priority.MEDIUM)); 
 
        return xmlUrlSet; 
    } 
@XmlAccessorType(value = XmlAccessType.NONE) 
@XmlRootElement(name = "urlset", namespace = "http://www.sitemaps.org/schemas/sitemap/0.9") 
public class XmlUrlSet { 
 
    @XmlElements({@XmlElement(name = "url", type = XmlUrl.class)}) 
    private Collection<XmlUrl> xmlUrls = new ArrayList<>(); 
 
    public void addUrl(XmlUrl xmlUrl) { 
        xmlUrls.add(xmlUrl); 
    } 
 
    public Collection<XmlUrl> getXmlUrls() { 
        return xmlUrls; 
    } 
} 

Possible errors

Bing

No issues with Bing, it digest everything ;-)

Google

The sitemap doesn't appear immediately in the results after the submission

The answer has to be MediaType.APPLICATION_XML_VALUE, if forgotten the xml will not be processed (http will answer with a json header) without any error message.

Error: Your Sitemap or Sitemap index file doesn't properly declare the namespace.

Google doesn't like if you have multiple namespaces`prefixes declared. ex.:

<ns2:urlset xmlns:ns2="http://www.sitemaps.org/schemas/sitemap/0.9"> 
<url> 
<loc>https://marco.dev</loc>` 

To make Google happy add a package-info.java to your package and add the followin line:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.sitemaps.org/schemas/sitemap/0.9", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED, xmlns = { @javax.xml.bind.annotation.XmlNs(namespaceURI = "http://www.sitemaps.org/schemas/sitemap/0.9", prefix = "") }) 
package ... // your package 

This will remove the namespace from the xml file



WebApp built by Marco using SpringBoot, Java 16, Mustache, Markdown and Hosted using Jelastic