这取决于您选择的语言/模板,因为其中一些比其他更灵活,但同样的原则也适用:您不应该在生成的代码中添加任何额外的逻辑。不幸的是,通过查看 的示例jaxrs-spec
,这些模板看起来不如jaxrs-resteasy
.
此时,您可以:
- 将模板切换到不同的
jaxrs
- 编写您自己的模板并改用它们
- 修改/更新 swagger-codegen 模板并将它们提交回来。
我将解释如何为其他模板完成此操作。目前完成的方式是通过工厂,但也可以通过依赖注入轻松完成。Codgen 生成作为样板的存根实现来支持 API,并将实际逻辑委托给另一个类。
对于jaxrs-resteasy
,这是 codegen 为GET /{username}
方法生成的内容(我删除了它也放入的 swagger 注释):
@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 为该语言参数生成的准确示例。有时它们会过时。