首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成示例客户端和服务器时Restlet Studio错误422

生成示例客户端和服务器时Restlet Studio错误422
EN

Stack Overflow用户
提问于 2015-02-08 23:31:21
回答 1查看 609关注 0票数 0

嗨,我正在使用restlet从您的示例宠物存储API生成一个客户机和服务器。以下是我的步骤:

  1. 生成Java服务器(JAX)
  2. 编辑pom.xml创建war文件
  3. mvn封装
  4. 部署到jetty服务器作为webapp
  5. 通过使用浏览器访问URL:http://54.149.215.125:8080/v2/pet/findByTags来验证它是否有效

响应:

代码语言:javascript
复制
{"code":4,"type":"ok","message":"magic!"}
  1. 此时,我认为它可以工作,直到我用Java生成客户机为止。
  2. 我将端点从webnik one更改为webserver。
  3. 做一个简单的主要方法 公共静态void ( Logger.getLogger(APIPetStore.class.getName()).log(Level.SEVERE,args) { FindPetByTagsClientResource a=新的FindPetByTagsClientResource();Pet表示= a.represent();}FindPetByTagsClientResource(异常ex) {FindPetByTagsClientResource null,ex;}}
  4. 当我运行它时,我得到了这个:

run:启动内部HTTP客户端空

非处理实体(422) -服务器理解请求实体的内容类型,并且请求实体的语法是正确的,但是无法在org.restlet.engine.resource.ClientInvocationHandler.invoke(ClientInvocationHandler.java:326)的com.sun.agent上处理包含的指令。$Proxy5表示(未知源)在net.apispark.webapi.client.FindPetByTagsClientResource.represent(FindPetByTagsClientResource.java:22) at apipetstore.APIPetStore.main()由: org.restlet.engine.converter.DefaultConverter.toObject(DefaultConverter.java:282):无法在org.restlet.service.ConverterService.toObject(ConverterService.java:229) at org.restlet.service.ConverterService.toObject(ConverterService.java:229) at org.restlet.resource.Resource.toObject(Resource.java:889) .4创建对象表示的原因: java.lang.IllegalArgumentException:序列化后的表示必须具有以下媒体类型: application /x序列化对象或此媒体类型:应用程序/x-java序列化对象+xml在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秒)

  1. 将主要方法改为此方法,它可以工作: 公共静态void ( a.getClientResource().get().write(System.out);args) {String[]{ FindPetByTagsClientResource a=新FindPetByTagsClientResource();String[]} catch (异常ex) { Logger.getLogger(APIPetStore.class.getName()).log(Level.SEVERE,null,ex);}}
  2. 输出:

启动内部HTTP客户端

代码语言:javascript
复制
{"code":4,"type":"ok","message":"magic!"}

我有什么办法解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2015-02-10 06:36:23

实际上,JAXRS服务器框架实际上是一个服务器框架;-)这意味着它实际上没有按照客户端发送正确的内容。如果您查看服务器代码,您总是可以看到以下内容:

代码语言:javascript
复制
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工作:

代码语言:javascript
复制
@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内部使用swagger2码元工具链来生成这个服务器框架。

希望能帮上忙,蒂埃里

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

https://stackoverflow.com/questions/28400652

复制
相关文章

相似问题

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