2011-10-07 57 views
1

創建一個絕對URI我有一個XmlAdapter元帥一類關聯的對象各自的REST URI的:使用UriBuilder從XmlAdapter

public class AirportAdapter extends XmlAdapter<URI, Airport> { 

@Override 
public URI marshal(Airport airport) throws Exception { 
    return UriBuilder.fromResource(AirportsResource.class).path(AirportsResource.class, 
      "getAirportResource").build(airport.getId()); 
} 

然而,這產生了一個相對URL(/機場/ 1),其無法將URI解組爲Airport對象(顯然):

@Override 
    public Airport unmarshal(URI uri) throws Exception { 
     // Does work, but not desirable 
     return JAXB.unmarshal("http://localhost/resources" + uri, Airport.class) 
     // Does not work 
     return JAXB.unmarshal(uri, Airport.class); 
    } 
} 

我需要UriBuilder建立一個絕對路徑(HTTP://本地主機/資源/一irports/1),我知道我可以使用UriInfo類來做到這一點,但我不能將它注入到適配器中,因爲它不是資源。當我用協議,主機和資源路徑預先加載URI時,解組確實有效。通過什麼方式讓UriBuilder建立一條絕對路徑而不需要自己預先設置?

更新

我想如果我創建了一個JAXB上下文自己:

JAXBContext jc = JAXBContext.newInstance("com.acme.foo:com.acme.bar"); 
Unmarshaller u = jc.createUnmarshaller(); 

,並設置適配器上的解組自己,通過實體管理器從數據庫中,而不是抓住正確的對象通過URI進行編組,這些還會被框架使用嗎?還是它自己創建新的實例,使這種方法變爲靜音?

回答

1

如果您在Marshaller/Unmarshaller那麼XmlAdapter的該實例將在已經標註了@XmlJavaTypeAdapter使用該類別的所有地方使用設置XmlAdapter的一個實例。

在JAX-RS的環境,如新澤西州,你可以使用MessageBodyReader/MessageBodyWriter此設置。

+1

這是一個很好的資源布萊斯,謝謝!我現在工作完美:-) – Laurens