我正在尝试将表单发布到Restlet ServerResource并使用Gson Restlet Extension将其读入对象。
有no documentation关于如何使用它而在StackOverflow上没有任何内容。
使用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();
}
}
答案 0 :(得分:3)
事实上,您可以利用Restlet的内置转换器支持,而无需明确使用gson转换器。
实际上,当您将GSON扩展放在类路径中时,它包含的转换器会自动在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
*/
然后,您可以依赖服务器资源中方法签名而不是类Representation,如下所述:
public class MyServerResource extends ServerResource {
@Post
public SomeOutputBean handleBean(SomeInputBean input) {
(...)
SomeOutputBean bean = new SomeOutputBean();
bean.setId(10);
bean.setName("some name");
return 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是一个Java库,可用于将Java对象转换为 他们的JSON表示。它还可以用于转换JSON字符串 到等效的Java对象。 Gson可以使用任意Java对象 包括你没有源代码的预先存在的对象。
希望它可以帮到你, 亨利