无法弄清楚如何通过 swagger 在 auto-generated 的 jaxrs 服务器中访问请求 headers
Cannot figure how to access request headers in a jaxrs server that is auto-generated by swagger
这是我当前的虚拟 POST 登录功能。我想阅读 public Response loginPost()
中的请求 headers。是否可以?例如,我尝试更改函数参数,但我总是得到 io.swagger.api.impl.LoginApiServiceImpl is not abstract and does not override abstract method loginPost(io.swagger.model.LoginPostRequestBody,javax.ws.rs.core.SecurityContext) in io.swagger.api.LoginApiService
package io.swagger.api.impl;
import io.swagger.api.*;
import io.swagger.model.*;
import io.swagger.model.LoginPost200Response;
import io.swagger.model.LoginPostRequestBody;
import java.util.Map;
import java.util.List;
import io.swagger.api.NotFoundException;
import java.io.InputStream;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.validation.constraints.*;
@javax.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.JavaJerseyServerCodegen", date = "2020-01-21T12:31:41.554Z[GMT]")public class LoginApiServiceImpl extends LoginApiService {
@Override
public Response loginPost(LoginPostRequestBody body, SecurityContext securityContext) throws NotFoundException {
// do some magic!
}
}
此 auto-generated class 无法访问 http headers。相反,必须转到 src/gen/java/io/swagger/api/myApi.java
并执行以下操作
import javax.ws.rs.core.HttpHeaders;
- 编辑文件最后部分的响应函数,使其
也接受这个论点
@Context HttpHeaders requestHeaders
- 修改最后的异常代码,函数也有
需要采用上述参数(在这种情况下没有
@Context
)
然后更新同一文件夹中的 myApiService.java
文件,当然还有 src/main/java/io/swagger/api/impl/
中的 myApiServiceImpl.java
文件,以便它们都导入 javax.ws.rs.core.HttpHeaders
并作为参数。在后一种情况下也不要使用 @Context
。
大意是先修改myApi.java
文件,使其通过requestheaders,然后更新所有使用request函数的文件(如果你想不通的话,编译器错误会指导你)
Tasos 的解决方案是正确的。但是,修改生成的代码不是我的菜。因此我建议修改 Mustache 模板:
API template and API service template(以及应该效仿的 'Impl' 模板)。
我建议将服务中的 SecurityContext securityContext
替换为一个新的容器对象,用于存储所有需要的 @Context
对象。
例如:
// ... snippet from apiService.mustache ...
public abstract class {{classname}}Service {
public static class Context {
private final UriInfo uriInfo;
private final SecurityContext securityContext;
public Context(HttpHeaders httpHeaders, SecurityContext securityContext) {
this.httpHeaders = httpHeaders;
this.securityContext = securityContext;
}
// ... getters
}
{{#operation}}
public abstract Response {{nickname}}({{#allParams}}{{>serviceQueryParams}}{{>servicePathParams}}{{>serviceHeaderParams}}{{>serviceBodyParams}}{{>serviceFormParams}},{{/allParams}}Context context) throws NotFoundException;
{{/operation}}
}
{{/operations}}
可以相应地修改api.mustache文件以在调用委托方法之前填充Context
。
public Response {{nickname}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}},{{/allParams}}@Context SecurityContext securityContext,
@Context HttpHeaders httpHeaders) throws NotFoundException {
var context = new {{classname}}Service.Context(httpHeaders, securityContext);
return delegate.{{nickname}}({{#allParams}}{{#isFormParam}}{{#isFile}}{{paramName}}Bodypart{{/isFile}}{{/isFormParam}}{{^isFile}}{{paramName}}{{/isFile}}{{^isFormParam}}{{#isFile}}{{paramName}}{{/isFile}}{{/isFormParam}}, {{/allParams}}context);
}
上述方法使使用生成代码的实现保持一致,代码生成后无需修改。
这是我当前的虚拟 POST 登录功能。我想阅读 public Response loginPost()
中的请求 headers。是否可以?例如,我尝试更改函数参数,但我总是得到 io.swagger.api.impl.LoginApiServiceImpl is not abstract and does not override abstract method loginPost(io.swagger.model.LoginPostRequestBody,javax.ws.rs.core.SecurityContext) in io.swagger.api.LoginApiService
package io.swagger.api.impl;
import io.swagger.api.*;
import io.swagger.model.*;
import io.swagger.model.LoginPost200Response;
import io.swagger.model.LoginPostRequestBody;
import java.util.Map;
import java.util.List;
import io.swagger.api.NotFoundException;
import java.io.InputStream;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.validation.constraints.*;
@javax.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.JavaJerseyServerCodegen", date = "2020-01-21T12:31:41.554Z[GMT]")public class LoginApiServiceImpl extends LoginApiService {
@Override
public Response loginPost(LoginPostRequestBody body, SecurityContext securityContext) throws NotFoundException {
// do some magic!
}
}
此 auto-generated class 无法访问 http headers。相反,必须转到 src/gen/java/io/swagger/api/myApi.java
并执行以下操作
import javax.ws.rs.core.HttpHeaders;
- 编辑文件最后部分的响应函数,使其
也接受这个论点
@Context HttpHeaders requestHeaders
- 修改最后的异常代码,函数也有
需要采用上述参数(在这种情况下没有
@Context
)
然后更新同一文件夹中的 myApiService.java
文件,当然还有 src/main/java/io/swagger/api/impl/
中的 myApiServiceImpl.java
文件,以便它们都导入 javax.ws.rs.core.HttpHeaders
并作为参数。在后一种情况下也不要使用 @Context
。
大意是先修改myApi.java
文件,使其通过requestheaders,然后更新所有使用request函数的文件(如果你想不通的话,编译器错误会指导你)
Tasos 的解决方案是正确的。但是,修改生成的代码不是我的菜。因此我建议修改 Mustache 模板: API template and API service template(以及应该效仿的 'Impl' 模板)。
我建议将服务中的 SecurityContext securityContext
替换为一个新的容器对象,用于存储所有需要的 @Context
对象。
例如:
// ... snippet from apiService.mustache ...
public abstract class {{classname}}Service {
public static class Context {
private final UriInfo uriInfo;
private final SecurityContext securityContext;
public Context(HttpHeaders httpHeaders, SecurityContext securityContext) {
this.httpHeaders = httpHeaders;
this.securityContext = securityContext;
}
// ... getters
}
{{#operation}}
public abstract Response {{nickname}}({{#allParams}}{{>serviceQueryParams}}{{>servicePathParams}}{{>serviceHeaderParams}}{{>serviceBodyParams}}{{>serviceFormParams}},{{/allParams}}Context context) throws NotFoundException;
{{/operation}}
}
{{/operations}}
可以相应地修改api.mustache文件以在调用委托方法之前填充Context
。
public Response {{nickname}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}},{{/allParams}}@Context SecurityContext securityContext,
@Context HttpHeaders httpHeaders) throws NotFoundException {
var context = new {{classname}}Service.Context(httpHeaders, securityContext);
return delegate.{{nickname}}({{#allParams}}{{#isFormParam}}{{#isFile}}{{paramName}}Bodypart{{/isFile}}{{/isFormParam}}{{^isFile}}{{paramName}}{{/isFile}}{{^isFormParam}}{{#isFile}}{{paramName}}{{/isFile}}{{/isFormParam}}, {{/allParams}}context);
}
上述方法使使用生成代码的实现保持一致,代码生成后无需修改。