2014-01-15 5 views
2

Я новичок в чванстве, и я считаю, что документация фрагментирована и не хватает, мягко говоря. Я пытаюсь использовать аннотацию 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».

Любая помощь?

ответ

1

Проблема возникает при столкновении с именем класса. В проекте codegen есть один класс SwaggerSerializers и один в ядре swagger. Итак, что произошло, компилятор использовал один из них, а другой был использован во время выполнения, поэтому отсутствует метод.

I've just sent a pull request с одной из возможных рефакторингов для решения этой проблемы.

+0

Да, я понял это, но забыл обновить мое СО. Он работает, если код для генерации спецификации и кода для генерации кода клиента состоит из двух отдельных блоков компиляции с разными классами. Пока это не будет исправлено, у меня есть два отдельных модуля. Не идеально, но он работает нормально. Проекты должны быть объединены imo. –

Смежные вопросы