首页 > 解决方案 > Springfox swagger 在某些模型上没有正确显示替代类型映射

问题描述

我有一堆实体在许多forms, list, map,multimap等的控制器中返回...

我有一个解决方案,您可以定义类型映射(entity -> dto, dto -> entity),其中实体是实际JPA实体,并且 a用一堆注释和东西DTO表示实体的形式。JSONswagger

jackson从这些映射中创建了 2 个模块,基本上有很多StdDelegatingDeserializerStdDelegatingSerializer. 然后将此模块添加到jackson中,它们可以正常工作。

当控制器返回一个实体类型时,实际JSON是从 DTO 创建的,当您希望在控制器中接收一个实体时也是如此。

在这个应用程序中,还swagger设置了一个带有 UI 的招摇,并且在swagger配置中,我将所有这些映射添加为替代类型映射。swagger 文档中的大多数模型都很好,但在某些情况下,文档显示实体的结构而不是DTO.

我将映射存储在以下类的列表中

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ModelMapperKey<E, D> {
    @NonNull
    private Class<E> entityType;

    @NonNull
    private Class<D> dtoType;
}

从这个列表中,我创建了一个AlternateTypeRuleConventionbean 并swagger自动处理它

    @Bean
    public AlternateTypeRuleConvention alternateTypeRuleConvention() {
        return new AlternateTypeRuleConvention() {

            @Override
            public int getOrder() {
                return Ordered.HIGHEST_PRECEDENCE;
            }

            @Override
            public List<AlternateTypeRule> rules() {
                return modelMapperService.getMapperKeys()
                        .stream()
                        .map(key -> newRule(resolver.resolve(key.getEntityType()), resolver.resolve(key.getDtoType())))
                        .collect(Collectors.toList());
            }
        };
    }

正如我所提到的,它工作得很好,并DTOswagger文档中显示了实际情况,预计某些情况下不会。目前,60 次中有 11 次显示的是实体而不是DTO模型。我检查了很多次,为那些DTO-s 创建了替代类型规则并添加到上下文中。当您执行请求时,swagger UI我会得到正确的json响应。

我试图玩规则优先

newRule(resolver.resolve(key.getEntityType()), resolver.resolve(key.getDtoType()), Ordered.HIGHEST_PRECEDENCE)

也尝试过0Ordered.LOWEST_PRECEDENCE但没有一个有效。我不知道是什么导致了这种现象。

标签: javaspringspring-bootswagger

解决方案


推荐阅读