java - Swagger 代码生成 : simple JAX-RS example

标签 java scala rest swagger

我是 swagger 的新手,我发现文档是零散的,至少可以说缺乏。我正在尝试使用 Swagger 注释来注释我的 JAX-RS 兼容类,以静态生成多种语言和文档的客户端库(这是一个加号)。但是,我似乎找不到一个开箱即用的简单示例。

这是我非常简单的 REST 服务:

package com.mypack.rest;

import com.mypack.entity.Person;
import com.mypack.service.PeopleService;
import com.wordnik.swagger.annotations.*;

import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import java.util.Collection;

@Path("/people")
@Api(value = "/people", description = "Manage people")
public class PeopleRestService {
  private final PeopleService peopleService;

  public PeopleRestService(PeopleService peopleService) {
    this.peopleService = peopleService;
  }

  @Produces({MediaType.APPLICATION_JSON})
  @GET
  @ApiOperation(value = "List all people", notes = "List all people using paging", response = Person.class, responseContainer = "List")
  public Collection<Person> getPeople(@ApiParam(value = "Page to fetch", required = true) @QueryParam("page") @DefaultValue("1") final int page) {
    return peopleService.getPeople(page, 5);
  }

  @Produces({MediaType.APPLICATION_JSON})
  @Path("/{email}")
  @GET
  @ApiOperation(value = "Find person by e-mail", notes = "Find person by e-mail", response = Person.class)
  @ApiResponses({
        @ApiResponse(code = 404, message = "Person with such e-mail doesn't exists")
  })
  public Person getPeople(@ApiParam(value = "E-Mail address to lookup for", required = true) @PathParam("email") final String email) {
    return peopleService.getByEmail(email);
  }

// and more methods ...
}

然后我有一个 scala 类来生成客户端库(根据 github 上的示例):

import com.wordnik.swagger.codegen.BasicJavaGenerator

object JavaPeopleServiceCodegen extends BasicJavaGenerator {
  def main(args: Array[String]) = generateClient(args)

  override def templateDir = "Java"
  override def destinationDir = "src/main/java"
  override def invokerPackage = Some("com.mypack.client")
  override def modelPackage = Some("com.mypack.entity")
  override def apiPackage = Some("com.mypack.api")

  additionalParams ++= Map(
    "artifactId" -> "people-rest",
    "artifactVersion" -> "1.0.0",
    "groupId" -> "com.mypack")

  override def supportingFiles =
    List(
      ("apiInvoker.mustache", destinationDir + java.io.File.separator + invokerPackage.get.replace(".", java.io.File.separator) + java.io.File.separator, "ApiInvoker.java"),
      ("JsonUtil.mustache", destinationDir + java.io.File.separator + invokerPackage.get.replace(".", java.io.File.separator) + java.io.File.separator, "JsonUtil.java"),
      ("apiException.mustache", destinationDir + java.io.File.separator + invokerPackage.get.replace(".", java.io.File.separator) + java.io.File.separator, "ApiException.java"),
      ("pom.mustache", "", "pom.xml"))
}

现在,当我尝试运行这个文件时,我总是会收到以下错误:

Exception in thread "main" java.lang.NoSuchMethodError: com.wordnik.swagger.model.SwaggerSerializers$.formats(Ljava/lang/String;)Lorg/json4s/Formats;
  at com.wordnik.swagger.codegen.Codegen.<init>(Codegen.scala:45)
  at com.wordnik.swagger.codegen.BasicGenerator.<init>(BasicGenerator.scala:44)
  at com.wordnik.swagger.codegen.BasicJavaGenerator.<init>(BasicJavaGenerator.scala:25)
  at JavaPeopleServiceCodegen$.<init>(JavaPeopleServiceCodegen.scala:3)

最后,在我的 pom 文件中,我有 javax.ws.rsswaggerswagger-codegen 的依赖项。我不明白我是否缺少一些运行时依赖项(它看起来不像),我的 scala 库是错误的(我安装了 scala 2.10.3 并且 swagger 依赖项是针对 2.10 编译的,它应该是二进制兼容的)或者我不明白一些基本的“陷阱”。

有什么帮助吗?

最佳答案

问题是类名冲突。 codegen项目中有一个SwaggerSerializers类,swagger core中有一个。所以发生的事情是编译器使用了其中一个,而另一个试图在运行时使用,因此缺少一个方法。

I've just sent a pull request通过可能的重构之一来解决这个问题。

关于java - Swagger 代码生成 : simple JAX-RS example,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21148861/

相关文章:

java - Play框架的模板引擎中是否有 "instanceof"功能?

java - 不支持 Spring Social/connect/twitter 请求方法 'GET'

Scala 隐式参数投影冲突, "Ambigious Implicit Values"错误

javascript - Sails Js - 按关联值与蓝图排序

java - 如何通过 Web 服务和 API 从互联网动态更新 Android 应用程序数据

java - jfreecharts中如何调整x、y轴线

java - Java 6 更新 19,20 中的绘图性能与 Java 6 更新 3 相比?

scala - 为什么在这个 Scala 代码中需要向上转换?

scala - 删除 Spark DataFrame 的第一行

rest - 从 Rest api 运行 rundeck 作业