Skip to content

Commit 1874abe

Browse files
committed
Add more deep test for "test class property is not exposed"
1 parent a6cd1fb commit 1874abe

File tree

2 files changed

+56
-20
lines changed

2 files changed

+56
-20
lines changed

openapi/src/main/java/io/micronaut/openapi/visitor/SchemaDefinitionUtils.java

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import io.micronaut.inject.ast.GenericPlaceholderElement;
5353
import io.micronaut.inject.ast.MemberElement;
5454
import io.micronaut.inject.ast.PropertyElement;
55+
import io.micronaut.inject.ast.PropertyElementQuery;
5556
import io.micronaut.inject.ast.TypedElement;
5657
import io.micronaut.inject.ast.WildcardElement;
5758
import io.micronaut.inject.visitor.VisitorContext;
@@ -1485,9 +1486,19 @@ private static void populateSchemaProperties(OpenAPI openAPI, VisitorContext con
14851486
if (classElement != null && !ClassUtils.isJavaLangType(classElement.getName())) {
14861487
List<PropertyElement> beanProperties;
14871488
try {
1488-
beanProperties = classElement.getBeanProperties().stream()
1489-
.filter(p -> !"groovy.lang.MetaClass".equals(p.getType().getName()))
1490-
.toList();
1489+
beanProperties = classElement.getBeanProperties(
1490+
PropertyElementQuery.of(classElement)
1491+
.excludedAnnotations(Set.of(
1492+
Hidden.class.getName(),
1493+
JsonIgnore.class.getName()
1494+
))
1495+
).stream()
1496+
.filter(p ->
1497+
!"groovy.lang.MetaClass".equals(p.getType().getName())
1498+
&& !"java.lang.Class".equals(p.getType().getName())
1499+
&& !getAnnotationMetadata(p).booleanValue(io.swagger.v3.oas.annotations.media.Schema.class, PROP_HIDDEN).orElse(false)
1500+
)
1501+
.toList();
14911502
} catch (Exception e) {
14921503
warn("Error with getting properties for class " + classElement.getName() + ": " + e + "\n" + Utils.printStackTrace(e), context, classElement);
14931504
// Workaround for https://github.com/micronaut-projects/micronaut-openapi/issues/313
@@ -2298,12 +2309,7 @@ private static void processPropertyElements(OpenAPI openAPI, VisitorContext cont
22982309
}
22992310

23002311
for (TypedElement publicField : publicFields) {
2301-
boolean isHidden = getAnnotationMetadata(publicField).booleanValue(io.swagger.v3.oas.annotations.media.Schema.class, PROP_HIDDEN).orElse(false);
2302-
var jsonAnySetterAnn = getAnnotation(publicField, JsonAnySetter.class);
2303-
if (isAnnotationPresent(publicField, JsonIgnore.class)
2304-
|| isAnnotationPresent(publicField, Hidden.class)
2305-
|| (jsonAnySetterAnn != null && jsonAnySetterAnn.booleanValue("enabled").orElse(true))
2306-
|| isHidden) {
2312+
if (isHiddenElement(publicField)) {
23072313
continue;
23082314
}
23092315

@@ -2353,6 +2359,17 @@ private static void processPropertyElements(OpenAPI openAPI, VisitorContext cont
23532359
}
23542360
}
23552361

2362+
private static boolean isHiddenElement(TypedElement elementType) {
2363+
boolean isHidden = getAnnotationMetadata(elementType)
2364+
.booleanValue(io.swagger.v3.oas.annotations.media.Schema.class, PROP_HIDDEN).orElse(false);
2365+
var jsonAnySetterAnn = getAnnotation(elementType, JsonAnySetter.class);
2366+
return elementType.getType().isAssignable(Class.class)
2367+
|| isAnnotationPresent(elementType, JsonIgnore.class)
2368+
|| isAnnotationPresent(elementType, Hidden.class)
2369+
|| (jsonAnySetterAnn != null && jsonAnySetterAnn.booleanValue("enabled").orElse(true))
2370+
|| isHidden;
2371+
}
2372+
23562373
private static boolean allowedByJsonView(TypedElement publicField, String[] classLvlJsonViewClasses, ClassElement jsonViewClassEl, VisitorContext context) {
23572374
String[] fieldJsonViewClasses = getAnnotationMetadata(publicField).stringValues(JsonView.class);
23582375
if (ArrayUtils.isEmpty(fieldJsonViewClasses)) {

openapi/src/test/groovy/io/micronaut/openapi/visitor/OpenApiClassPropertySpec.groovy

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,21 @@ import io.micronaut.openapi.AbstractOpenApiTypeElementSpec
44
import io.swagger.v3.oas.models.OpenAPI
55

66
class OpenApiClassPropertySpec extends AbstractOpenApiTypeElementSpec {
7+
78
void "test class property is not exposed"() {
89

910
when:
1011
buildBeanDefinition("test.MyBean", '''
1112
package test;
1213
14+
import com.fasterxml.jackson.annotation.JsonIgnore;
1315
import io.micronaut.core.annotation.Introspected;
1416
import io.micronaut.http.HttpResponse;
15-
import io.micronaut.http.MediaType;
16-
import io.micronaut.http.annotation.*;
17-
17+
import io.micronaut.http.annotation.Controller;
18+
import io.micronaut.http.annotation.Get;
1819
import io.swagger.v3.oas.annotations.Hidden;
19-
import io.swagger.v3.oas.annotations.Operation;
20-
import io.swagger.v3.oas.annotations.Parameter;
21-
import io.swagger.v3.oas.annotations.enums.ParameterIn;
22-
import io.swagger.v3.oas.annotations.media.Content;
2320
import io.swagger.v3.oas.annotations.media.Schema;
24-
import io.swagger.v3.oas.annotations.responses.ApiResponse;
25-
26-
import jakarta.validation.constraints.*;
21+
import jakarta.validation.constraints.NotBlank;
2722
2823
@Controller
2924
class PersonController {
@@ -56,6 +51,29 @@ class Person {
5651
public Class<?> getPersonClass() {
5752
return personClass;
5853
}
54+
55+
public Class<?> getTestProp() {
56+
return personClass;
57+
}
58+
59+
public String getNotHiddenProp() {
60+
return "";
61+
}
62+
63+
@Hidden
64+
public String getHiddenProp2() {
65+
return "";
66+
}
67+
68+
@JsonIgnore
69+
public String getHiddenProp3() {
70+
return "";
71+
}
72+
73+
@Schema(hidden = true)
74+
public String getHiddenProp4() {
75+
return "";
76+
}
5977
}
6078
6179
@jakarta.inject.Singleton
@@ -70,8 +88,9 @@ public class MyBean {}
7088
openAPI.components.schemas["Person"].type == "object"
7189

7290
openAPI.components.schemas["Person"].properties
73-
openAPI.components.schemas["Person"].properties.size() == 1
91+
openAPI.components.schemas["Person"].properties.size() == 2
7492

7593
openAPI.components.schemas["Person"].properties["name"]
94+
openAPI.components.schemas["Person"].properties["notHiddenProp"]
7695
}
7796
}

0 commit comments

Comments
 (0)