当前位置: 首页 > 知识库问答 >
问题:

Java的Swagger+Jersey数字枚举

邹俊豪
2023-03-14

我的Rest API中有一个字段(在Jersey+jackson+Bean Validation中实现),它是一组封闭的数值。例如,员工等级,它可以是以下值之一:1,2,5,7。而不是,则不能为每个值定义匹配字符串。

我正在尝试获得生成的swagger文档,以便为这些值提供一个数字枚举。我尝试了以下方法:

>

  • 使用以下属性定义整数:@apimodelproperty(allowableValues=“1,2,5,7”)Integer employeeRankswagger-ui没有显示任何枚举,只是在将employeeRank的类型更改为string之后。因此不幸的是,allowableValues只能与String参数一起工作,而我不希望我的模型是这样的。employeeRank必须是整数。
  • 定义枚举:

    @JsonSerialize(using = BlockSize.OrderTypeSerializer.class)
    @JsonDeserialize(using = BlockSize.OrderTypeDeserializer.class)
    public enum EmployeeRank {
        ONW(1),
        TWO(2),
        FIVE(5),
        SEVEN(7)
    int rank;
    
    EmployeeRank(int rank) {
        this.rank = rank;
    }
    
    @JsonValue
    public int getRank() {
        return rank;
    }
    
    public class RankSerializer extends JsonSerializer<EmployeeRank> {
    
    
        @Override
        public void serialize(EmployeeRank rank, JsonGenerator generator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
            generator.writeStartObject();
            generator.writeFieldName("rank");
            generator.writeNumber(rank.getRank());
            generator.writeEndObject();
        }
    }
    
    public class RankDeserializer extends JsonDeserializer<EmployeeRank> {
    
        @Override
        public EmployeeRank deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
            int val =jsonParser.getValueAsInt();
            if (val == 1) {
                return ONE;
            }
    
            if (val == 2) {
                return TWO;
            }
    
            if (val == 5) {
                return FIVE;
            }
    
            if (val == 7) {
                return SEVEN;
            }
    
            throw new IOException("Illiegal rank value " + val);
        }
    } 
    

    没有运气。swagger-ui将枚举以枚举名称(一、二、五、七)的形式呈现

    用Swagger在Jersey中定义一组数值来理解它,这似乎是一个相当琐碎的任务。知道吗?

    以下是我的资源:

            resourceConfig.packages(true, ResponseWrapper.class.getPackage().getName());
            resourceConfig.property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
            resourceConfig.property(ServerProperties.BV_DISABLE_VALIDATE_ON_EXECUTABLE_OVERRIDE_CHECK, true);
    
    
                resourceConfig.register(ApiListingResource.class);
                resourceConfig.register(SwaggerSerializers.class);
    
            resourceConfig.register(EncodingFilter.class);
            resourceConfig.register(GZipEncoder.class);
            resourceConfig.register(DeflateEncoder.class);
            resourceConfig.register(JacksonFeature.class);
            resourceConfig.register(MultiPartFeature.class);
            resourceConfig.register(ValidationConfigurationContextResolver.class);
    

    和我的Swagger初始化器:

     BeanConfig beanConfig = new BeanConfig();
            beanConfig.setVersion("3.0");
            beanConfig.setSchemes(new String[]{"https"});
            beanConfig.setHost("localhost");
            beanConfig.setBasePath("/api");
            beanConfig.setPrettyPrint(true);
            beanConfig.setResourcePackage(ApiLevel.class.getPackage().getName());
            beanConfig.setScan(true);
    

    更新

    在@fehguy的建议下,我升级到了jackson 2.7。而且有一些进展。请考虑以下枚举:

    public enum Status {
            @JsonProperty("hello")
            ENUM1,
            @JsonProperty("world")
            ENUM2;
        }
    

    运行以下主要应用程序工作:

    public static void main(String[] args) throws JsonProcessingException {
            ObjectMapper mapper = new ObjectMapper();
            Status user = Status.ENUM1;
    
            System.out.println(mapper.writeValueAsString(user));
        }
    

    输出是“hello”,这正是我需要的。

    但是,swagger-ui仍然显示枚举值。也许它不处理枚举值上的JSONProperty注释?

  • 共有1个答案

    江鸿羲
    2023-03-14

    这是一个jackson配置问题。看看在2.6.2或更高版本中使用@JSONProperty注释,它将允许您为枚举设置友好名称。

     类似资料:
    • 我有一个java对象,它有一个名为type的属性,代表一个枚举: 当使用springfox在yaml中生成规范时,该对象在引用对象TypeValue时生成以下输出: 我想做的是在生成doc时忽略枚举类型,从规范中删除枚举类型。这就是我想要的: type:对象属性:op:type:string路径:type:string值:type:对象属性:{}标题:补丁 我尝试使用@ApiModelProper

    • 我想在我的项目中包含swagger,但我不能更改代码或变量名称。 我有一个返回列表的服务: 代码变量来自枚举操作可能的错误: 是否可以将“代码”和TYPE枚举相关联,以便我可以在生成的swagger文档中显示选项列表? 谢谢

    • 在尝试获取allowableValues标记的枚举值时,我遇到了以下错误。 批注属性apimodelProperty.AllowAbleValues的值必须是常量表达式 我想做的是: 我有可能做我想做的事吗?我知道在我的API中只公开枚举是可能的,然后swagger会自动识别允许的值,但是需要将有问题的字段公开为字符串,即使我们的内部逻辑将其作为枚举。 提前感谢您的帮助!

    • 问题内容: 是否可以像下面那样进行枚举 这样,当我按输入值进行搜索时,请说101。它将返回“ rich”?如何在枚举中做到这一点?能举个例子吗?我不想用forloop循环整个枚举来获取string_value。可能? 问题答案: 如其他建议的那样,将with与值一起使用。 然后,提供一种静态方法,该方法通过对所有值的有序列表/数组执行二进制搜索,而不是对枚举值执行强力迭代搜索。 要执行搜索,请从中

    • 我正在使用 swagger(1.2) 来记录我的球衣 jaxrs (2.1) api。我使用 swagger-ui 来显示我的 api。对于 http GET 请求,我在 api endpoint中有一个查询参数作为 @QueryParam(“token”)。Swagger 正在显示此查询参数的字段,但是当我每次收到它的空值时单击“尝试一下!”按钮时。 我还用@ApiParam注释了@ query