它取決於您選擇的語言/模板,因爲它們中的一些比另一些更靈活,但同樣的原理也適用:您不應該在生成的代碼中添加任何其他邏輯。不幸的是,通過查看sample for jaxrs-spec
,這些模板看起來不像jaxrs-resteasy
那樣好。
在這一點上,你可以:
- 切換模板,以不同的
jaxrs
- 寫自己的模板,並用它們來代替
- 修改/更新招搖,代碼生成模板,並把它們提交回。
我將逐步解釋如何完成其他模板。目前完成的方式是通過工廠,但依靠注入可以輕鬆完成。 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爲該語言參數生成的準確示例。有時他們會過時。
您生成哪種語言?具體來說,你用swagger codegen使用了哪些模板? – nickb
@nickb對,謝謝。它是Java。這個問題太籠統了,Java標籤沒有幫助。我會更新我的問題。 – freedev