Skip to content

Commit b7a1048

Browse files
authored
Merge pull request #1616 from altro3/merge-6.11.x
Merge 6.11.x
2 parents e439872 + 4c35ae3 commit b7a1048

File tree

3 files changed

+125
-12
lines changed

3 files changed

+125
-12
lines changed

gradle/libs.versions.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@ micronaut-platform = "4.5.0"
2323
micronaut-jaxrs = "4.5.0"
2424
micronaut-security = "4.9.0"
2525
micronaut-serde = "2.10.2"
26-
micronaut-rxjava2 = "2.3.0"
26+
micronaut-rxjava2 = "2.4.0"
2727
micronaut-rxjava3 = "3.4.0"
2828
micronaut-reactor = "3.4.0"
2929
micronaut-gradle-plugin = "4.4.0"
3030
micronaut-groovy = "4.3.0"
31-
micronaut-validation = "4.6.0"
32-
micronaut-data = "4.8.1"
31+
micronaut-validation = "4.6.1"
32+
micronaut-data = "4.8.3"
3333
micronaut-test = "4.3.0"
3434
micronaut-kotlin = "4.3.0"
3535
micronaut-logging = "1.3.0"

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)) {
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package io.micronaut.openapi.visitor
2+
3+
import io.micronaut.openapi.AbstractOpenApiTypeElementSpec
4+
import io.swagger.v3.oas.models.OpenAPI
5+
6+
class OpenApiClassPropertySpec extends AbstractOpenApiTypeElementSpec {
7+
8+
void "test class property is not exposed"() {
9+
10+
when:
11+
buildBeanDefinition("test.MyBean", '''
12+
package test;
13+
14+
import com.fasterxml.jackson.annotation.JsonIgnore;
15+
import io.micronaut.core.annotation.Introspected;
16+
import io.micronaut.http.HttpResponse;
17+
import io.micronaut.http.annotation.Controller;
18+
import io.micronaut.http.annotation.Get;
19+
import io.swagger.v3.oas.annotations.Hidden;
20+
import io.swagger.v3.oas.annotations.media.Schema;
21+
import jakarta.validation.constraints.NotBlank;
22+
23+
@Controller
24+
class PersonController {
25+
26+
@Get("/person/{name}")
27+
HttpResponse<Person> get(@NotBlank String name) {
28+
return HttpResponse.ok();
29+
}
30+
}
31+
32+
/**
33+
* The person information.
34+
*/
35+
@Introspected
36+
class Person {
37+
38+
private String name;
39+
private Class<?> personClass;
40+
public String getName() {
41+
return name;
42+
}
43+
public void setName(String name) {
44+
this.name = name;
45+
}
46+
47+
public void setPersonClass(Class<?> personClass) {
48+
this.personClass = personClass;
49+
}
50+
51+
public Class<?> getPersonClass() {
52+
return personClass;
53+
}
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+
}
77+
}
78+
79+
@jakarta.inject.Singleton
80+
public class MyBean {}
81+
82+
''')
83+
84+
then:
85+
OpenAPI openAPI = Utils.testReference
86+
openAPI?.paths?.get("/person/{name}")?.get
87+
openAPI.components.schemas["Person"]
88+
openAPI.components.schemas["Person"].type == "object"
89+
90+
openAPI.components.schemas["Person"].properties
91+
openAPI.components.schemas["Person"].properties.size() == 2
92+
93+
openAPI.components.schemas["Person"].properties["name"]
94+
openAPI.components.schemas["Person"].properties["notHiddenProp"]
95+
}
96+
}

0 commit comments

Comments
 (0)