2015-10-21 48 views
2

我有XML這樣的:JAXB不能處理XML元素含有白色空間java.net.URI中的映射

<repository> 
<location>/home/username whitespace/somedir</location> 
</repository> 

我使用JAXB來解組到JAXB註解Bean的這一點。 「位置」XML元素映射到java.net.URI類。 問題是,當位置包含空白時,JAXB(或可能是底層的XML解析器)無法處理此位置,並且位置設置爲null。沒有UnmarshalException或任何東西,只是setLocation(URI loc)被稱爲null方法的參數。

當然,沒有空白的URI工作正常。 事情是,我不能真的改變RepositoryDTO說有String location;字段。

你能告訴我在這裏有什麼選擇嗎?

我應該看看URLEncode然後解碼說location字段?

這是一個REST /澤西使用情況的方式,但顯然是罪魁禍首在於JAXB/XML解析器...

public class Whitespace { 

    public static void main(String[] args) throws JAXBException { 
     String xml = "<repository><location>/home/username whitespace/somedir</location></repository>"; 

     Unmarshaller createUnmarshaller = JAXBContext.newInstance(RepositoryDTO.class).createUnmarshaller(); 
     RepositoryDTO repositoryInfo = (RepositoryDTO) createUnmarshaller.unmarshal(new StringReader(xml)); 
     System.out.println(repositoryInfo.getLocation()); 

    } 

    @XmlRootElement(name = "repository") 
    static public class RepositoryDTO { 
     private URI location; 

     @XmlElement 
     public URI getLocation() { 
      return location; 
     } 

     public void setLocation(URI loc) { 
      this.location = loc; 
     } 

    } 
} 

回答

1

您可以使用此適配器

import java.net.URI; 
import java.net.URISyntaxException; 

import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class UriAdapter extends XmlAdapter<String, URI> { 

    public URI unmarshal(String s) { 
     if(s != null){ 
      try { 
       return new URI(s.replace(" ", "%20")); 
      } catch (URISyntaxException e) { 
      } 
     } 
     return null; 
    } 

    public String marshal(URI uri) { 
     return uri.getPath(); 
    } 
} 

這樣

@XmlJavaTypeAdapter(UriAdapter.class) 
protected URI location; 
+0

接受這個答案,雖然我寧願使用URLEncoder或類似於自己編碼。 – Svilen

1

嘗試使用空白的非標準URI編碼(XML元素內更換空間與20%)

+0

是的,這將起作用,因爲您最終沒有空格......但爲什麼JAXB/XML解析器如果無法處理內容就會失敗?將它映射爲null似乎很混亂......它是否爲空,因爲它有一個空白區域?或者它是空的,因爲它實際上是空的,XML只是不包含「位置」元素。這真的讓我感到困擾:( – Svilen

+0

我認爲這個URI在構造函數中失敗了,因爲一個URI java.net objexts不能有空格(它在構造函數中被驗證) - 並且它不會是有效的,你不能調用新的URI(someString )如果someString包含空格,它會拋出一個URINotValidException或任何異常被調用 – ABR