【问题标题】:Restlet Studio Error 422 when generating sample client and server生成示例客户端和服务器时出现 Restlet Studio 错误 422
【发布时间】:2015-02-08 23:31:21
【问题描述】:

您好,我正在使用 restlet studio 从您的示例宠物商店 API 生成客户端和服务器。这是我的步骤:

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

回复:

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

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

运行: 启动内部 HTTP 客户端 空

Unprocessable Entity (422) - 服务器理解请求实体的内容类型并且请求实体的语法正确但无法处理包含的指令 在 org.restlet.resource.Resource.toObject(Resource.java:893) 在 org.restlet.engine.resource.ClientInvocationHandler.invoke(ClientInvocationHandler.java:326) 在 com.sun.proxy.$Proxy5.represent(未知来源) 在 net.apispark.webapi.client.FindPetByTagsClientResource.represent(FindPetByTagsClientResource.java:22) 在 apipetstore.APIPetStore.main(APIPetStore.java:28) 原因:java.io.IOException:无法创建对象表示 在 org.restlet.engine.converter.DefaultConverter.toObject(DefaultConverter.java:282) 在 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 或此:application/x-java-serialized-object+xml 在 org.restlet.representation.ObjectRepresentation.(ObjectRepresentation.java:221) 在 org.restlet.representation.ObjectRepresentation.(ObjectRepresentation.java:123) 在 org.restlet.representation.ObjectRepresentation.(ObjectRepresentation.java:104) 在 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. 输出:

启动内部 HTTP 客户端

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

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

【问题讨论】:

    标签: rest jax-rs restlet swagger restlet-2.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 工具链来生成这个服务器骨架。

    希望对你有帮助, 蒂埃里

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-19
      • 2016-11-16
      • 2015-03-21
      • 2017-11-06
      • 2015-06-19
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      相关资源
      最近更新 更多