我有一堆实体,它们在许多forms
,list
,map
,multimap
等控制器中返回……
我有一个解决方案,其中您定义类型映射(entity -> dto, dto -> entity)
,其中实体是实际的JPA
实体,而DTO
代表实体的JSON
形式,一堆swagger
注释和内容。
我从这些映射中创建2个jackson
模块,这些模块基本上是StdDelegatingDeserializer
和StdDelegatingSerializer
的大部分。然后将此模块添加到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)
也尝试了0
和Ordered.LOWEST_PRECEDENCE
,但它们都不起作用。我不知道什么会导致这种现象。