首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取XmlAdapter中的当前主机

获取XmlAdapter中的当前主机
EN

Stack Overflow用户
提问于 2013-07-31 19:40:08
回答 1查看 431关注 0票数 0

有没有办法在XmlAdapter中检索当前的基URI?或者这通常是如何归档的?

代码语言:javascript
复制
public class Service{
...
    @GET
    public MyEntity getEntity() {
        return em.find(MyEntity.class, "dummy");
    }
...
}


@XmlRootElement(name = "myEntity")
public class MyEntity {

    @XmlJavaTypeAdapter(MyAdapter.class)
    private Entity2 entity2Ref;
...

}



public class MyAdapter extends XmlAdapter<Entity2Ref, Entity2> {

// Is NULL but shold be injected with host URI
@Context
UriInfo uri;

...

}
EN

回答 1

Stack Overflow用户

发布于 2013-08-01 05:44:19

下面是一个完整的示例,说明如何做到这一点:

XML响应

下面我将演示如何获得以下响应,其中address元素中的URI是通过感知UriInfoXmlAdapter放入的。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<customer id="1">
    <name>Jane Doe</name>
    <address>http://localhost:9999/address/123</address>
</customer>

Java模型

下面是我将在本例中使用的Java模型。

客户

默认情况下,Address类的内容将编组到customer元素下。我们将使用XmlAdapter对此进行特殊处理。

代码语言:javascript
复制
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
@XmlType(propOrder={"name", "address"})
public class Customer {

    private int id;
    private String name;
    private Address address;

    @XmlAttribute
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlJavaTypeAdapter(AddressAdapter.class)
    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

}

地址

代码语言:javascript
复制
import javax.xml.bind.annotation.XmlAttribute;

public class Address {

    private int id;

    @XmlAttribute
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

}

XmlAdapter

下面是我们将使用的XmlAdapter。注意它是如何从AddressResource获取用于构建URI的信息的。它需要一个UriInfo,这使得它是有状态的。我们需要在Marshaller上设置此XmlAdapter的一个实例,以使一切正常工作。

代码语言:javascript
复制
import javax.ws.rs.core.*;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class AddressAdapter extends XmlAdapter<String, Address> {

    private UriInfo uriInfo;

    public AddressAdapter() {
    }

    public AddressAdapter(UriInfo uriInfo) {
        this.uriInfo = uriInfo;
    }

    @Override
    public Address unmarshal(String v) throws Exception {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String marshal(Address v) throws Exception {
        if(null == uriInfo) {
            return "";
        }
        UriBuilder builder = UriBuilder.fromResource(AddressResource.class);
        System.out.println(uriInfo.getAbsolutePath().getHost());
        builder.scheme(uriInfo.getAbsolutePath().getScheme());
        builder.host(uriInfo.getAbsolutePath().getHost());
        builder.port(uriInfo.getAbsolutePath().getPort());
        builder.path(AddressResource.class, "get");
        return builder.build(v.getId()).toString();
    }

}

JAX-RS服务

在本例中,有两个服务,一个用于Address,另一个用于Customer

AddressResource

代码语言:javascript
复制
import javax.ws.rs.*;
import javax.ws.rs.ext.Provider;

@Provider
@Path("/address")
public class AddressResource {

    @GET
    @Path("{id}")
    public Address get(@PathParam("id") int id) {
        Address address = new Address();
        address.setId(id);
        return address;
    }

}

CustomerResource

因为我们有一个有状态的XmlAdapter,所以我们不能仅仅通过缺省绑定来利用JAXB。相反,我们可以通过StreamingOutput访问JAXB。

代码语言:javascript
复制
import javax.ws.rs.*;
import javax.ws.rs.core.*;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.*;

@Provider
@Path("/customer")
public class CustomerResource {

    private JAXBContext jaxbContext;

    public CustomerResource() {
        try {
            jaxbContext = JAXBContext.newInstance(Customer.class);
        } catch (JAXBException e) {
            // TODO - Handle Exception
        }
    }

    @GET
    @Path("{id}")
    @Produces(MediaType.APPLICATION_XML)
    public StreamingOutput get(@Context UriInfo uriInfo, @PathParam("id") int id) {
        Customer customer = new Customer();
        customer.setId(id);
        customer.setName("Jane Doe");

        Address address = new Address();
        address.setId(123);
        customer.setAddress(address);

        return new MyStreamingOutput(jaxbContext, customer, uriInfo);
    }

}

StreamingOutput

代码语言:javascript
复制
import java.io.*;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.*;
import javax.xml.bind.*;

public class MyStreamingOutput implements StreamingOutput {

    private JAXBContext jaxbContext;
    private Object object;
    private UriInfo uriInfo;

    public MyStreamingOutput(JAXBContext jc, Object object, UriInfo uriInfo) {
        this.jaxbContext = jc;
        this.object = object;
        this.uriInfo = uriInfo;
    }

    @Override
    public void write(OutputStream os) throws IOException,
            WebApplicationException {
        try {
            Marshaller marshaller = jaxbContext.createMarshaller();
            marshaller.setAdapter(new AddressAdapter(uriInfo));
            marshaller.marshal(object, os);
        } catch(JAXBException jaxbException) {
            throw new WebApplicationException(jaxbException);
        }
    }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17969343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档