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(); }