2017-01-27 45 views
4

Swagger項目非常適合用各種語言輕鬆創建客戶端和服務器應用程序,但我不明白如何維護或擴展現有項目一個正確的方法。Swagger - 如何使用swagger-codegen並長期建立項目

我正在生成一個Java服務器 - 語言參數是jaxrs-spec

我寫了自己的Maven pom並使用了swagger-codegen-maven-plugin,所以現在我可以直接用maven生成模型或api。

我看到每次重建我的項目時,API將被swagger-codegen插件完全重寫。

我需要實現我的應用程序邏輯,並且目前除了自定義生成的API源代碼之外,我沒有看到任何其他方法。 因此,爲了避免在每次構建中丟失我的工作,我可以配置.swagger-codegen-ignore(我做過),但是我只是推遲了這個問題。

由於第一次必須更新swagger.json,我唯一的選擇是重新生成整個API並覆蓋我的工作。好吧,我可以使用git並嘗試恢復已刪除的部分,但確實是一個非常難看的解決方案。

所以,問題是:使用swagger-codegen

(或一般揚鞭)有一個模式,一個如何,一個文件的方式,讓我補充一個行爲和/或延長生成的API沒有覆蓋我的代碼?

+0

您生成哪種語言?具體來說,你用swagger codegen使用了哪些模板? – nickb

+0

@nickb對,謝謝。它是Java。這個問題太籠統了,Java標籤沒有幫助。我會更新我的問題。 – freedev

回答

7

它取決於您選擇的語言/模板,因爲它們中的一些比另一些更靈活,但同樣的原理也適用:您不應該在生成的代碼中添加任何其他邏輯。不幸的是,通過查看sample for jaxrs-spec,這些模板看起來不像jaxrs-resteasy那樣好。

在這一點上,你可以:

  1. 切換模板,以不同的jaxrs
  2. 寫自己的模板,並用它們來代替
  3. 修改/更新招搖,代碼生成模板,並把它們提交回。

我將逐步解釋如何完成其​​他模板。目前完成的方式是通過工廠,但依靠注入可以輕鬆完成。 Codgen生成存根實現,這是實現API的樣板文件,並將實際的邏輯委託給另一個類。

對於jaxrs-resteasy,這裏是代碼生成生成一個GET /{username}方法(我刪除了招搖的註釋但也可能使):

@GET 
@Path("/{username}") 
@Produces({ "application/xml", "application/json" }) 
public Response getUserByName(@PathParam("username") String username,@Context SecurityContext securityContext) 
throws NotFoundException { 
    return delegate.getUserByName(username,securityContext); 
} 

的實際方法只委託給一家工廠,它獲得像這樣:

private final UserApiService delegate = UserApiServiceFactory.getUserApi(); 

它可以做到這一點,因爲它也產生了API來實現一個基類:

public abstract class UserApiService { 
    // methods omitted... 
    public abstract Response getUserByName(String username, SecurityContext securityContext) throws NotFoundException; 
    // methods omitted... 
} 

現在,在非生成的代碼,用戶將這個基類的實現:

public class UserApiServiceImpl extends UserApiService { 
     // methods omitted... 
     @Override 
     public Response getUserByName(String username, SecurityContextsecurityContext) throws NotFoundException { 
      // do some magic! 
      return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); 
    } 
    // methods omitted... 
} 

然後,用戶添加的工廠在CODEGEN期望的包,所以所生成的代碼可以得到上面的實現:

public class UserApiServiceFactory { 
    private final static UserApiService service = new UserApiServiceImpl(); 

    public static UserApiService getUserApi() { 
     return service; 
    } 
} 

現在已生成的代碼確切地知道實施UserApiService委託給它。此時,整個服務器樣板與應用程序邏輯分開,允許您重新生成API而不覆蓋自定義邏輯。

此答案假定jaxrs-spec的示例是swagger-codegen爲該語言參數生成的準確示例。有時他們會過時。

+0

謝謝,這個解決方案有點麻煩,但它似乎符合我的需求。我會立即嘗試。 – freedev

+1

我試過了,最後我更喜歡切換並使用'jaxrs-resteasy'。再次感謝您的寶貴幫助。 :) – freedev