Как сгенерировать правильное пространство имен карты сайта с помощью JAXB и Spring @ResponseBody в контроллере?

Все работает нормально, за исключением того, что я не могу правильно создать пространство имен. Любая помощь высоко ценится!

Мой контроллер:

@Controller
@RequestMapping("/sitemap")
public class SitemapController
{
    public @ResponseBody XMLURLSet getSitemap(){
       XMLURLSet urlSet = new XMLURLSet();
       //populate urlList
       urlSet.setUrl(urlList);
       return urlSet;
    }
}

Мой набор адресов:

@XmlRootElement(name = "url")
public class XMLURL {
   String loc;
   @XmlElement(name = "loc")
   public String getLoc(){
      return loc;
   }
   public void setLoc(String loc){
   this.loc = loc;
}

}

Мой элемент URL:

   @XmlRootElement(name = "urlset", namespace = "http://www.sitemaps.org/schemas/sitemap/0.9")
    public class XMLURLSet{
       List<XMLURL> url;
       public List<XMLURL> getUrl(){
          return url;
       }
       public void setUrl(List<XMLURL> url){
       this.url = url;
    }

}

Что я ожидал получить:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.example.com/</loc>
</url>

Что получилось:

<ns2:urlset xmlns:ns2="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.example.com/</loc>
</url>
</ns2:urlset>
</urlset> 

Спасибо!


person Community    schedule 06.12.2011    source источник


Ответы (1)


Вы можете использовать аннотацию @XmlSchema, чтобы указать, что elementFormDefault квалифицирован. Это должно помочь в вашем случае использования.

@XmlSchema(
    namespace = "http://www.sitemaps.org/schemas/sitemap/0.9",
    elementFormDefault = XmlNsForm.QUALIFIED)
package example;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

Для получения дополнительной информации

person bdoughan    schedule 06.12.2011
comment
Где я могу найти содержимое файла package-info? - person ; 06.12.2011
comment
package-info на самом деле является классом, поэтому у вас будет package-info.java в том же пакете, что и классы вашего домена, с содержимым, аналогичным тому, что дано в моем ответе. - person bdoughan; 06.12.2011
comment
оно работает. в том же потоке, как бы вы добавили кодировку XML для создания ‹?xml version=1.0 encoding=UTF-8?›. Я видел, как это сделать, манипулируя маршлером, но мой код не позволяет мне это сделать. - person ; 06.12.2011
comment
@Pomario - по умолчанию JAXB генерирует заголовок (может помочь следующее: blog.bdoughan.com/2011/08/). В вашем случае использования JAXB может объединяться в поток, запущенный spring, поэтому вам может потребоваться что-то настроить на этом уровне. - person bdoughan; 06.12.2011