2014-01-15 35 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,swaggerswagger-codegen。我不明白,如果我错过了一些运行时依赖(它看起来不像它),我的scala库是错误的(我已经安装了scala 2.10.3,并且依赖于swift的2.10编译,这应该是二进制兼容的)或者我还没有理解一些基本的“陷阱”。

任何帮助?

回答

1

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

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

+0

是的,我想通了,但忘了更新我的SO。如果生成规范的代码和实际生成客户端代码的代码位于具有不同类路径的两个单独编译单元中,它就可以工作。在此之前,我有两个独立的模块。不理想,但它工作正常。这些项目应该合并为imo。 –