无法弄清楚如何通过 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 并执行以下操作

  1. import javax.ws.rs.core.HttpHeaders;
  2. 编辑文件最后部分的响应函数,使其 也接受这个论点 @Context HttpHeaders requestHeaders
  3. 修改最后的异常代码,函数也有 需要采用上述参数(在这种情况下没有 @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);
    }

上述方法使使用生成代码的实现保持一致,代码生成后无需修改。