XML& JSON web api:来自POJO的自动映射?

时间:2015-01-31 11:05:35

标签: xml json restlet pojo

我即将开始一个小项目,目标是最终得到一个web xml / json api。我将用Java编写它,并且我将使用restlet库。

如何处理xml / json二元性?我知道我可以使用JAXB来转换" pojos到xml(和后面),但我如何为json自动执行此操作?我可以利用restlet库中的任何功能吗?

1 个答案:

答案 0 :(得分:1)

Restlet允许您在REST注释方法级别直接使用服务器资源中的POJO,如下所述:

public class MyServerResource extends ServerResource {
    @Get
    public List<MyPojo> getList() {
        List<MyPojo> list = (get list from backend for example)
        return list;
    }

    @Post
    public MyPojo addPojo(Pojo pojo) {
        addPojoInBackend(pojo

        getResponse().setLocationRef(getUri() + field.getId());
        getResponse().setStatus(Status.SUCCESS_CREATED);

        return pojo;
    }
}

您无需在注释内容中指定媒体类型(即内容类型)。

为了处理这样的代码,Restlet提供了一个通用的转换功能,可以完成工作。 Restlet扩展为此功能提供了不同的实现。如果你想为你的RESTful应用程序同时拥有XML和JSON,我认为你应该为你想做的杰出扩展。 Jackson(http://wiki.fasterxml.com/JacksonHome)是一个允许将POJO转换为XML,JSON和YAML等各种格式的工具。

要启用此功能,只需将Jackson扩展的JAR文件(org.restlet.ext.jackson)放入类路径中,然后使用上述编程方法。以下是有关其工作原理的详细信息:

  • 您将能够发送JSON和XML内容(在请求中设置标头Content-Type),Restlet会自动将此内容转换为注释方法中预期的bean。

    POST /myresource
    Content-type: application/json
    { "id":"myid", ... }
    
  • 要通过响应切换/选择预期内容,您可以根据标题Accept利用连接(REST的内容取消)。如果您指定application/json,则会收到JSON内容,并且会收到applicaiton/xml,即XML。

    GET /myresource
    Accept: application/json
    { "id":"myid", ... }
    
    GET /myresource
    Accept: application/xml
    <elt><id>myid> ... </elt>
    
  • 您可以注意到Restlet还支持查询参数media(非标准)来选择要接收的内容。如果您指定json,将收到JSON内容,xml将收到XML内容。

    GET /myresource?media=json
    { "id":"myid", ... }
    
    GET /myresource?media=xml
    <elt><id>myid> ... </elt>
    

要完成,您可以注意到服务器端也支持Restlet这种机制。这意味着您可以直接使用bean。此功能可与Restlet带注释的接口一起使用,如下所述:

public interface MyResource {
    @Get
    List<MyPojo> getList();

    @Post
    MyPojo addPojo(Pojo pojo);
}

您可以按照以下说明使用此界面:

ClientResource cr = new ClientResource("http://(...)/myresource");
MyResource myResource = cr.wrap(MyResource.class);
// List
List<Pojo> list = myResource.getList();
// Add
Pojo pojo = new Pojo();
pojo.setId("myid"); // for example
(...)
Pojo returnedPojo = myResource.add(pojo);

Don'忘记在客户端类路径应用程序中放入扩展名Jackson。

希望它有所帮助, 亨利