使用XmlAdapter中的UriBuilder创建绝对URI

时间:2011-10-07 13:52:52

标签: java java-ee rest jaxb jersey

我有一个XmlAdapter来将类中的关联对象封送到各自的REST URI:

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( / Airports / 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:// localhost / resources / airports / 1 ),我知道我可以使用UriInfo来做到这一点class,但我不能将它注入适配器,因为它不是资源。当我使用协议,主机和资源路径预先添加URI时,解组确实有效。有什么方法可以让UriBuilder建立一个绝对的路径,而不是自己预先发布它?

更新

我想我是否自己创建了一个JAXB上下文:

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

并在我自己的unmarshaller上设置适配器,传递实体管理器从数据库中获取正确的对象,而不是通过URI获取umarshalling,这些也可以由框架使用,或者自己创建新的实例,渲染这个接近静音?

1 个答案:

答案 0 :(得分:1)

如果您在XmlAdapter / Marshaller上设置Unmarshaller的实例,那么XmlAdapter的该实例将在所有已注释{{{}}的地方使用{1}}使用该类。

在泽西岛等JAX-RS环境中,您可以使用@XmlJavaTypeAdapter / MessageBodyReader进行设置。