Springfox swagger在某些模型上未正确显示替代类型映射

时间:2019-12-03 15:04:09

标签: java spring spring-boot swagger

我有一堆实体,它们在许多formslistmapmultimap等控制器中返回……

我有一个解决方案,其中您定义类型映射(entity -> dto, dto -> entity),其中实体是实际的JPA实体,而DTO代表实体的JSON形式,一堆swagger注释和内容。

我从这些映射中创建2个jackson模块,这些模块基本上是StdDelegatingDeserializerStdDelegatingSerializer的大部分。然后将此模块添加到jackson中,它们就可以正常工作。

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

在此应用程序中,还设置了swagger UI,并且在swagger配置中,我将所有此映射添加为替代类型映射。大张旗鼓的文档中的大多数模型都不错,但是在某些情况下,文档显示的是实体结构,而不是DTO

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

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

    @NonNull
    private Class<D> dtoType;
}

从此列表中,我创建一个AlternateTypeRuleConvention bean,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());
            }
        };
    }

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

我尝试使用规则优先级

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

也尝试了0Ordered.LOWEST_PRECEDENCE,但它们都不起作用。我不知道什么会导致这种现象。

0 个答案:

没有答案