2024年1月1日发(作者:)
import peDeterminer;import ntationContext;import terExpansionContext;import ionContext;import ttributeField;import ttributeParameterExpander;
import fo;import pectionException;import pector;import tyDescriptor;import ;import t;import ;import ;
import static ;import static ates.*;import static OrEmpty;import static ;import static ayList;import static hSet;import static tionElementType;import static ainerType;import static meFor;
/** *
覆盖{@link ModelAttributeParameterExpander} * @see CustomizeModelAttributeParameterExpander#getBeanPropertyNames(Class) * @see ModelAttributeParameterExpander#getBeanPropertyNames(Class) * @see IgnoreSwaggerParameter */@Component@Primarypublic class CustomizeModelAttributeParameterExpander extends ModelAttributeParameterExpander {
private static final Logger LOG = ger(); private final FieldProvider fieldProvider; private final EnumTypeDeterminer enumTypeDeterminer;
@Autowired public CustomizeModelAttributeParameterExpander(FieldProvider fields, EnumTypeDeterminer enumTypeDeterminer) { super(fields, enumTypeDeterminer); rovider = fields; peDeterminer = enumTypeDeterminer; }
@Override public List expand(ExpansionContext context) {
List parameters = newArrayList(); Set beanPropNames = getBeanPropertyNames(amType().getErasedType()); Iterable fields = ((amType())) .filter(onlyBeanProperties(beanPropNames)); ("Expanding parameter type: {}", amType()); AlternateTypeProvider alternateTypeProvider = umentationContext().getAlternateTypeProvider();
FluentIterable modelAttributes = from(fields) .transform(toModelAttributeField(alternateTypeProvider));
FluentIterable expendables = modelAttributes .filter(not(simpleType())) .filter(not(recursiveType(context))); for (ModelAttributeField each : expendables) { ("Attempting to expand expandable field: {}", ld()); (
expand( ontext( nestedParentName(entName(), ld()), ldType(), umentationContext()))); }
FluentIterable collectionTypes = modelAttributes .filter(and(isCollection(), not(recursiveCollectionItemType(amType())))); for (ModelAttributeField each : collectionTypes) { ("Attempting to expand collection/array field: {}", ld());
ResolvedType itemType = collectionElementType(ldType()); if (Type(itemType) || (sedType())) { (simpleFields(entName(), umentationContext(), each)); } else { ( expand( ontext( nestedParentName(entName(), ld()), itemType, umentationContext()))); } }
FluentIterable simpleFields = (simpleType()); for (ModelAttributeField each : simpleFields) { (simpleFields(entName(), umentationContext(), each)); } return (parameters).filter(not(hiddenParameters())).toList(); }
private Predicate recursiveCollectionItemType(final ResolvedType paramType) { return new Predicate() { @Override public boolean apply(ModelAttributeField input) { return equal(collectionElementType(ldType()), paramType); } }; }
private Predicate hiddenParameters() { return new Predicate() { @Override public boolean apply(Parameter input) { return en(); } }; }
private Parameter simpleFields( String parentName, DocumentationContext documentationContext, ModelAttributeField each) { ("Attempting to expand field: {}", each); String dataTypeName = llable(typeNameFor(ldType().getErasedType())) .or(ldType().getErasedType().getSimpleName()); ("Building parameter for field: {}, with type: ", each, ldType()); ParameterExpansionContext parameterExpansionContext = new ParameterExpansionContext( dataTypeName, parentName, ld(), umentationType(), new ParameterBuilder()); return Parameter(parameterExpansionContext); }
}
private Predicate recursiveType(final ExpansionContext context) { return new Predicate() { @Override public boolean apply(ModelAttributeField input) { return nType(ldType()); } }; }
private Predicate simpleType() { return and(not(isCollection()), not(isMap()), or( belongsToJavaPackage(), isBaseType(), isEnum())); }
private Predicate isCollection() { return new Predicate() { @Override public boolean apply(ModelAttributeField input) { return isContainerType(ldType()); } }; }
private Predicate isMap() { return new Predicate() { @Override public boolean apply(ModelAttributeField input) { return ype(ldType()); } }; }
private Predicate isEnum() { return new Predicate() { @Override public boolean apply(ModelAttributeField input) { return (ldType().getErasedType()); } }; }
private Predicate belongsToJavaPackage() { return new Predicate() { @Override public boolean apply(ModelAttributeField input) { return kageName(ldType().getErasedType()).startsWith(""); } }; }
private Predicate isBaseType() { return new Predicate() { @Override public boolean apply(ModelAttributeField input) { return Type(ldType()) || ld().getType().isPrimitive(); } }; }
private Function toModelAttributeField( final AlternateTypeProvider alternateTypeProvider) { return new Function() { @Override public ModelAttributeField apply(ResolvedField input) { return new ModelAttributeField(fieldType(alternateTypeProvider, input), input); } }; }
private Predicate onlyBeanProperties(final Set beanPropNames) { return new Predicate() { @Override public boolean apply(ResolvedField input) { return ns(e()); } }; }
private String nestedParentName(String parentName, ResolvedField field) { String name = e(); ResolvedType fieldType = e(); if (isContainerType(fieldType) && !Type(collectionElementType(fieldType))) { name += "[0]"; }
if (isNullOrEmpty(parentName)) { return name; } return ("%s.%s", parentName, name); }
private ResolvedType fieldType(AlternateTypeProvider alternateTypeProvider, ResolvedField field) { return ateFor(e()); }
private Set getBeanPropertyNames(final Class> clazz) {
try { Set beanProps = new HashSet(); PropertyDescriptor[] propDescriptors = getBeanInfo(clazz).getPropertyDescriptors();
for (PropertyDescriptor propDescriptor : propDescriptors) {
//
增加逻辑,忽略@IgnoreSwaggerParameter注解的字段 Field field = laredField(e()); if (field!=null) { essible(true); IgnoreSwaggerParameter ignoreSwaggerParameter = laredAnnotation(); if (ignoreSwaggerParameter != null) { continue; } } //
增加结束
if (dMethod() != null) { (e()); } }
return beanProps;
} catch (Exception e) { (("Failed to get bean properties on (%s)", clazz), e);
import static ;import static meFor;/** *
覆盖{@link ModelAttributeParameterExpander} * * @see CustomizeModelAttributeParameterExpander#getBeanPropertyNames(Class) * @see ModelAttributeParameterExpander#getBeanPropertyNames(Class) * @see IgnoreSwaggerParameter */@Component@Primarypublic class CustomizeModelAttributeParameterExpander extends ModelAttributeParameterExpander { private static final Logger LOG = ger(); private final FieldProvider fields; private final AccessorsProvider accessors; private final EnumTypeDeterminer enumTypeDeterminer; @Autowired protected DocumentationPluginsManager pluginsManager; @Autowired public CustomizeModelAttributeParameterExpander(FieldProvider fields, AccessorsProvider accessors, EnumTypeDeterminer enumTypeDeterminer) { super(fields, accessors, enumTypeDeterminer); = fields; ors = accessors; peDeterminer = enumTypeDeterminer; } public List expand(ExpansionContext context) { List parameters = newArrayList(); Set propertyDescriptors = propertyDescriptors(amType().getErasedType()); Map propertyLookupByGetter = propertyDescriptorsByMethod(amType().getErasedType(), propertyDescriptors); Iterable getters = ((amType())) .filter(onlyValidGetters(())); Map fieldsByName = ((amType())) .uniqueIndex(new Function() { @Override public String apply(ResolvedField input) { return e(); } }); ("Expanding parameter type: {}", amType()); final AlternateTypeProvider alternateTypeProvider = umentationContext().getAlternateTypeProvider(); FluentIterable attributes = allModelAttributes( propertyLookupByGetter, getters, fieldsByName, alternateTypeProvider); FluentIterable expendables = attributes .filter(not(simpleType())) .filter(not(recursiveType(context))); for (ModelAttributeField each : expendables) { ("Attempting to expand expandable property: {}", e()); ( expand( ontext( nestedParentName(entName(), each), ldType(), rationContext())));
rationContext()))); } FluentIterable collectionTypes = attributes .filter(and(isCollection(), not(recursiveCollectionItemType(amType())))); for (ModelAttributeField each : collectionTypes) { ("Attempting to expand collection/array field: {}", e()); ResolvedType itemType = collectionElementType(ldType()); if (Type(itemType) || (sedType())) { (simpleFields(entName(), context, each)); } else { ExpansionContext childContext = ontext( nestedParentName(entName(), each), itemType, rationContext()); if (!nType(itemType)) { (expand(childContext)); } } } FluentIterable simpleFields = (simpleType()); for (ModelAttributeField each : simpleFields) { (simpleFields(entName(), context, each)); } return (parameters) .filter(not(hiddenParameters())) .filter(not(voidParameters())) .toList(); } private FluentIterable allModelAttributes( Map propertyLookupByGetter, Iterable getters, Map fieldsByName, AlternateTypeProvider alternateTypeProvider) { FluentIterable modelAttributesFromGetters = from(getters) .transform(toModelAttributeField(fieldsByName, propertyLookupByGetter, alternateTypeProvider)); FluentIterable modelAttributesFromFields = from(()) .filter(publicFields()) .transform(toModelAttributeField(alternateTypeProvider)); return (( (), ())); } private Function toModelAttributeField( final AlternateTypeProvider alternateTypeProvider) { return new Function() { @Override public ModelAttributeField apply(ResolvedField input) { return new ModelAttributeField( ateFor(e()), e(), input, input); } }; } private Predicate publicFields() {
private Predicate publicFields() { return new Predicate() { @Override public boolean apply(ResolvedField input) { return ic(); } }; } private Predicate voidParameters() { return new Predicate() { @Override public boolean apply(Parameter input) { return isVoid(e().orNull()); } }; } private Predicate recursiveCollectionItemType(final ResolvedType paramType) { return new Predicate() { @Override public boolean apply(ModelAttributeField input) { return equal(collectionElementType(ldType()), paramType); } }; } private Predicate hiddenParameters() { return new Predicate() { @Override public boolean apply(Parameter input) { return en(); } }; } private Parameter simpleFields( String parentName, ExpansionContext context, ModelAttributeField each) { ("Attempting to expand field: {}", each); String dataTypeName = llable(typeNameFor(ldType().getErasedType())) .or(ldType().getErasedType().getSimpleName()); ("Building parameter for field: {}, with type: ", each, ldType()); ParameterExpansionContext parameterExpansionContext = new ParameterExpansionContext( dataTypeName, parentName, determineScalarParameterType( rationContext().consumes(), rationContext().httpMethod()), new ModelAttributeParameterMetadataAccessor( tedElements(), ldType(), e()), umentationContext().getDocumentationType(), new ParameterBuilder()); return Parameter(parameterExpansionContext); } private Predicate recursiveType(final ExpansionContext context) { return new Predicate() { @Override public boolean apply(ModelAttributeField input) { return nType(ldType()); } };
}; } private Predicate simpleType() { return and(not(isCollection()), not(isMap()), or( belongsToJavaPackage(), isBaseType(), isEnum())); } private Predicate isCollection() { return new Predicate() { @Override public boolean apply(ModelAttributeField input) { return isContainerType(ldType()); } }; } private Predicate isMap() { return new Predicate() { @Override public boolean apply(ModelAttributeField input) { return ype(ldType()); } }; } private Predicate isEnum() { return new Predicate() { @Override public boolean apply(ModelAttributeField input) { return (ldType().getErasedType()); } }; } private Predicate belongsToJavaPackage() { return new Predicate() { @Override public boolean apply(ModelAttributeField input) { return kageName(ldType().getErasedType()).startsWith(""); } }; } private Predicate isBaseType() { return new Predicate() { @Override public boolean apply(ModelAttributeField input) { return Type(ldType()) || ldType().isPrimitive(); } }; } private Function toModelAttributeField( final Map fieldsByName, final Map propertyLookupByGetter, final AlternateTypeProvider alternateTypeProvider) { return new Function() { @Override public ModelAttributeField apply(ResolvedMethod input) { String name = (Member()).getName(); return new ModelAttributeField(
return new ModelAttributeField( fieldType(alternateTypeProvider, input), name, input, (name)); } }; } private Predicate onlyValidGetters(final Set methods) { return new Predicate() { @Override public boolean apply(ResolvedMethod input) { return ns(Member()); } }; } private String nestedParentName(String parentName, ModelAttributeField attribute) { String name = e(); ResolvedType fieldType = ldType(); if (isContainerType(fieldType) && !Type(collectionElementType(fieldType))) { name += "[0]"; } if (isNullOrEmpty(parentName)) { return name; } return ("%s.%s", parentName, name); } private ResolvedType fieldType(AlternateTypeProvider alternateTypeProvider, ResolvedMethod method) { return ateFor(e()); } private Set propertyDescriptors(final Class> clazz) { try { Set beanProps = new HashSet<>(); PropertyDescriptor[] descriptors = getBeanInfo(clazz).getPropertyDescriptors(); for (PropertyDescriptor descriptor : descriptors) { //
增加逻辑,忽略@IgnoreSwaggerParameter注解的字段 Field field = null; try { field = laredField(e()); } catch (Exception e) { (("Failed to get bean properties on (%s)", clazz), e); } if (field != null) { essible(true); IgnoreSwaggerParameter ignoreSwaggerParameter = laredAnnotation(); if (ignoreSwaggerParameter != null) { continue; } } //
增加结束 if (dMethod() != null) { (descriptor); } } return beanProps; } catch (Exception e) { (("Failed to get bean properties on (%s)", clazz), e); } return newHashSet(); }
发布评论