您好我正在使用restlet工作室从您的样本宠物商店API生成客户端和服务器。以下是我的步骤:
回应:
{"code":4,"type":"ok","message":"magic!"}
制作一个简单的主要方法
public static void main(String[] args) {
try {
FindPetByTagsClientResource a = new FindPetByTagsClientResource();
Pet represent = a.represent();
} catch (Exception ex) {
Logger.getLogger(APIPetStore.class.getName()).log(Level.SEVERE, null, ex);
}
}
当我运行它时,我得到了这个:
运行: 启动内部HTTP客户端 空
不可处理的实体(422) - 服务器理解请求实体的内容类型,请求实体的语法正确但无法处理包含的指令 在org.restlet.resource.Resource.toObject(Resource.java:893) at org.restlet.engine.resource.ClientInvocationHandler.invoke(ClientInvocationHandler.java:326) at com.sun.proxy。$ Proxy5.represent(Unknown Source) 在net.apispark.webapi.client.FindPetByTagsClientResource.represent(FindPetByTagsClientResource.java:22) 在apipetstore.APIPetStore.main(APIPetStore.java:28) 引起:java.io.IOException:无法创建Object表示 at org.restlet.engine.converter.DefaultConverter.toObject(DefaultConverter.java:282) at org.restlet.service.ConverterService.toObject(ConverterService.java:229) 在org.restlet.resource.Resource.toObject(Resource.java:889) ......还有4个 引起:java.lang.IllegalArgumentException:序列化表示必须具有以下媒体类型:application / x-java-serialized-object或this:application / x-java-serialized-object + xml at org.restlet.representation.ObjectRepresentation。(ObjectRepresentation.java:221) at org.restlet.representation.ObjectRepresentation。(ObjectRepresentation.java:123) at org.restlet.representation.ObjectRepresentation。(ObjectRepresentation.java:104) at org.restlet.engine.converter.DefaultConverter.toObject(DefaultConverter.java:279) ......还有6个 建立成功(总时间:0秒)
将main方法更改为此方法并且有效:
public static void main(String[] args) {
try {
FindPetByTagsClientResource a = new FindPetByTagsClientResource();
a.getClientResource().get().write(System.out);
} catch (Exception ex) {
Logger.getLogger(APIPetStore.class.getName()).log(Level.SEVERE, null, ex);
}
}
输出:
启动内部HTTP客户端
{"code":4,"type":"ok","message":"magic!"}
关于如何解决此问题的任何想法?
答案 0 :(得分:1)
事实上,JAXRS服务器框架实际上是一个服务器框架;-)这意味着它实际上并没有根据客户端发送回正确的内容。如果查看服务器代码,您总会看到:
public Response findPetsByTags(@ApiParam(value = "Tags to filter by") @QueryParam("tags") List<String> tags)
throws NotFoundException {
// do some magic!
return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build();
}
它不对应于宠物对象列表......
在客户端,由于您尝试使用带注释的接口,因此出现错误。他们会自动尝试使用Restlet的内部转换器。它失败了,因为它期望类型为Pet
的对象,并且您收到了具有此结构的内容:{"code":4,"type":"ok","message":"magic!"}
。
总之,您需要做一些工作来调整服务器框架以返回正确的对象。这是一个硬编码的解决方案,使您的客户端SDK工作:
@GET
@Path("/findByTags")
@ApiOperation(value = "Finds Pets by tags", notes = "Finds Pets by tags", response = Pet.class, responseContainer = "List")
@ApiResponses(value = {
@ApiResponse(code = 400, message = "") })
public Response findPetsByTags(@ApiParam(value = "Tags to filter by") @QueryParam("tags") List<String> tags)
throws NotFoundException {
// do some magic!
Pet pet = new Pet();
pet.setId(10);
pet.setName("My pet");
pet.setStatus("status");
List<Tag> actualTags = new ArrayList<Tag>();
Tag tag1 = new Tag();
tag1.setId(1);
tag1.setName("tag1");
actualTags.add(tag1);
Tag tag2 = new Tag();
tag2.setId(2);
tag2.setName("tag2");
actualTags.add(tag2);
pet.setTags(actualTags);
return Response.ok().entity(pet).build();
}
如果我们可以为服务器端改进这一点,我会看看。实际上,Restlet Studio在内部使用swagger2 codegen工具链来生成此服务器框架。
希望它有所帮助, 亨利