Я новичок в чванстве, и я считаю, что документация фрагментирована и не хватает, мягко говоря. Я пытаюсь использовать аннотацию Swagger, чтобы аннотировать мои JAX-RS-совместимые классы для статического создания клиентских библиотек на нескольких языках и документации (что является плюсом). Тем не менее, я не могу найти простой пример, который работает из коробки.Swagger codegen: простой пример 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.rs
, swagger
и swagger-codegen
. Я не понимаю, если мне не хватает некоторых зависимостей во время выполнения (это не похоже на это), моя библиотека scala неверна (у меня установлена scala 2.10.3, а зависимости swagger скомпилированы против 2.10, которая должна быть бинарной совместимой) или я не понял какой-то основной «gotcha».
Любая помощь?
Да, я понял это, но забыл обновить мое СО. Он работает, если код для генерации спецификации и кода для генерации кода клиента состоит из двух отдельных блоков компиляции с разными классами. Пока это не будет исправлено, у меня есть два отдельных модуля. Не идеально, но он работает нормально. Проекты должны быть объединены imo. –