使用 Gson for Restlet 将 Post 数据(表示)转换为对象

Using Gson for Restlet to convert Post data (Representation) to an Object

我正在尝试 post 一个表单到 Restlet ServerResource 并使用 Gson Restlet Extension.

将它读入一个对象

no documentation 关于如何使用它,但 Whosebug 上没有任何内容。

gson restlet扩展的正确使用方法是什么?

以下是我迄今为止尝试过的方法:

public class CustomerSegment {
    private int visitsMin;
    private int visitsMax;
    // Getters, Setters and constructors
}

public class CampaignsResource extends ServerResource {
    @Post
    public Representation createCampaign(Representation entity) {
        Form form = new Form(entity);
        // Using form is the usual way, which works fine
        // form: [[visitsMin=3], [visitsMax=6]]

        CustomerSegment segment = null;
        // Following hasn't worked 
        GsonConverter converter = new GsonConverter();
        try {
            segment = converter.toObject(entity, CustomerSegment.class, this);
            //segment = null
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        GsonRepresentation<CustomerSegment> gson
        = new GsonRepresentation<CustomerSegment>(entity, CustomerSegment.class);
        try {
            segment = gson.getObject();
            //NullPointerException
        } catch (IOException e) {
            e.printStackTrace();
        }

        return new EmptyRepresentation();
    }
} 

正在 posted 的表单数据:

事实上,您可以利用 Restlet 的内置转换器支持,而无需显式使用 gson 转换器。

事实上,当您将 GSON 扩展放在 class 路径中时,它包含的转换器会自动在 Restlet 引擎本身中注册。要检查您是否可以在启动应用程序时简单地使用这些行:

List<ConverterHelper> converters
       = Engine.getInstance().getRegisteredConverters();
for (ConverterHelper converterHelper : converters) {
    System.out.println("- " + converterHelper);
}

/* This will print this in your case:
   - org.restlet.ext.gson.GsonConverter@2085ce5a
   - org.restlet.engine.converter.DefaultConverter@30ae8764
   - org.restlet.engine.converter.StatusInfoHtmlConverter@123acf34
*/

然后您可以在服务器资源中依赖方法签名内的 beans 来代替 class 表示,如下所述:

public class MyServerResource extends ServerResource {
    @Post
    public SomeOutputBean handleBean(SomeInputBean input) {
        (...)
        SomeOutputBean bean = new SomeOutputBean();
        bean.setId(10);
        bean.setName("some name");
        return bean;
    }
}

这对双方都有效:

  • 将请求内容反序列化为 bean,作为服务器资源中处理方法的参数提供。
  • 序列化为返回bean的响应内容。

您在这里没有其他事可做。

对于客户端,您可以利用相同的机制。它基于带注释的接口。为此,您需要创建一个接口来定义可以在资源上调用的内容。对于我们之前的示例,它将是这样的:

public interface MyResource {
    @Post
    SomeOutputBean handleBean(SomeInputBean input);
}

然后您可以将它与客户端资源一起使用,如下所述:

String url = "http://localhost:8182/test";

ClientResource cr = new ClientResource(url);
MyResource resource = cr.wrap(MyResource.class);
SomeInputBean input = new SomeInputBean();
SomeOutputBean output = resource.handleBean(input);

因此,对于您的情况,我将按如下所述重构您的代码:

public class CampaignsResource extends ServerResource {
    private String getUri() {
        Reference resourceRef = getRequest().getResourceRef();
        return resourceRef.toString();
    }

    @Post
    public void createCampaign(CustomerSegment segment) {
        // Handle segment
        (...)

        // You can return something if the client expects
        // to have something returned
        // For creation on POST method, returning a 204 status
        // code with a Location header is enough...
        getResponse().setLocationRef(getUri() + addedSegmentId);
    }
}

例如,您可以利用内容类型 application/json 将数据发送为 JSON:

{
  visitsMin: 2,
  visitsMax: 11
}

如果你想使用 Gson,你应该使用这种内容类型而不是 urlencoded 类型,因为该工具的目标是 JSON 转换:

Gson is a Java library that can be used to convert Java Objects into their JSON representation. It can also be used to convert a JSON string to an equivalent Java object. Gson can work with arbitrary Java objects including pre-existing objects that you do not have source-code of.

希望对你有帮助, 蒂埃里