Skip to content
This repository was archived by the owner on Dec 4, 2025. It is now read-only.

Commit a6d9cac

Browse files
committed
feat: Add allowSelfReference configuration to control self-reference recursion in API documentation
1 parent 3ba8c4f commit a6d9cac

File tree

2 files changed

+54
-13
lines changed

2 files changed

+54
-13
lines changed

src/main/java/com/ly/doc/helper/ParamsBuildHelper.java

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,19 @@ else if (gName.length() == 1) {
527527
}
528528
}
529529
else {
530-
param.setSelfReferenceLoop(true);
530+
// Check configuration for self-reference in collections
531+
if (projectBuilder.getApiConfig().isAllowSelfReference()) {
532+
// Allow limited recursion when enabled
533+
if (level < 2) {
534+
paramList.addAll(buildParams(gName, preBuilder.toString(), nextLevel, isRequired,
535+
isResp, registryClasses, projectBuilder, groupClasses,
536+
methodJsonViewClasses, fieldPid, jsonRequest, atomicInteger));
537+
}
538+
}
539+
else {
540+
// Original behavior: set self reference loop
541+
param.setSelfReferenceLoop(true);
542+
}
531543
}
532544
}
533545

@@ -624,18 +636,32 @@ else if (gicName.contains("<")) {
624636
}
625637
}
626638
else if (simpleName.equals(subTypeName)) {
627-
// reference self
628-
ApiParam param1 = ApiParam.of()
629-
.setField(pre + fieldName)
630-
.setPid(pid)
631-
.setId(atomicOrDefault(atomicInteger, paramList.size() + pid + 1))
632-
.setClassName(subTypeName)
633-
.setMaxLength(maxLength)
634-
.setType(ParamTypeConstants.PARAM_TYPE_OBJECT)
635-
.setDesc(comment.append(" $ref... self").toString())
636-
.setVersion(DocGlobalConstants.DEFAULT_VERSION)
637-
.setExtensions(extensionParams);
638-
paramList.add(param1);
639+
// reference self - check configuration
640+
if (projectBuilder.getApiConfig().isAllowSelfReference()) {
641+
// Allow limited recursion when enabled
642+
processApiParam(paramList, param, isRequired, comment + appendComment, since, strRequired);
643+
fieldPid = Optional.ofNullable(atomicInteger).isPresent() ? param.getId()
644+
: paramList.size() + pid;
645+
if (level < 2) {
646+
paramList.addAll(buildParams(fieldGicName, preBuilder.toString(), nextLevel, isRequired,
647+
isResp, registryClasses, projectBuilder, groupClasses, methodJsonViewClasses,
648+
fieldPid, jsonRequest, atomicInteger));
649+
}
650+
}
651+
else {
652+
// Original behavior: create reference parameter
653+
ApiParam param1 = ApiParam.of()
654+
.setField(pre + fieldName)
655+
.setPid(pid)
656+
.setId(atomicOrDefault(atomicInteger, paramList.size() + pid + 1))
657+
.setClassName(subTypeName)
658+
.setMaxLength(maxLength)
659+
.setType(ParamTypeConstants.PARAM_TYPE_OBJECT)
660+
.setDesc(comment.append(" $ref... self").toString())
661+
.setVersion(DocGlobalConstants.DEFAULT_VERSION)
662+
.setExtensions(extensionParams);
663+
paramList.add(param1);
664+
}
639665
}
640666
else {
641667
processApiParam(paramList, param, isRequired, comment + appendComment, since, strRequired);

src/main/java/com/ly/doc/model/ApiConfig.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,13 @@ public class ApiConfig {
496496
*/
497497
private boolean enumConvertor = Boolean.FALSE;
498498

499+
/**
500+
* allow self reference recursion
501+
*
502+
* @since 3.1.0
503+
*/
504+
private boolean allowSelfReference = Boolean.FALSE;
505+
499506
public static ApiConfig getInstance() {
500507
return instance;
501508
}
@@ -1185,6 +1192,14 @@ public void setEnumConvertor(boolean enumConvertor) {
11851192
this.enumConvertor = enumConvertor;
11861193
}
11871194

1195+
public boolean isAllowSelfReference() {
1196+
return allowSelfReference;
1197+
}
1198+
1199+
public void setAllowSelfReference(boolean allowSelfReference) {
1200+
this.allowSelfReference = allowSelfReference;
1201+
}
1202+
11881203
public OpenApiTagNameTypeEnum getOpenApiTagNameType() {
11891204
return openApiTagNameType;
11901205
}

0 commit comments

Comments
 (0)