生成示例客户端和服务器时,Restlet Studio Error 422

时间:2015-02-08 23:31:22

标签: rest jax-rs restlet swagger restlet-2.0

您好我正在使用restlet工作室从您的样本宠物商店API生成客户端和服务器。以下是我的步骤:

  1. 生成Java Server(JAX-RS)
  2. 编辑pom.xml以生成war文件
  3. mvn package
  4. 以webapp身份部署到jetty服务器
  5. 通过使用浏览器点击网址验证其是否有效: http://54.149.215.125:8080/v2/pet/findByTags
  6. 回应:

    {"code":4,"type":"ok","message":"magic!"}
    
    1. 此时我认为它有效,直到我用Java生成客户端
    2. 我将端点从webnik改为我的网络服务器
    3. 制作一个简单的主要方法

      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);
          }
      }
      
    4. 当我运行它时,我得到了这个:

    5. 运行: 启动内部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秒)

      1. 将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);
            }
        }
        
      2. 输出:

      3. 启动内部HTTP客户端

        {"code":4,"type":"ok","message":"magic!"}
        

        关于如何解决此问题的任何想法?

1 个答案:

答案 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工具链来生成此服务器框架。

希望它有所帮助, 亨利