26
26
27
27
package org .springdoc .core .configuration ;
28
28
29
+ import java .util .List ;
29
30
import java .util .Optional ;
30
31
31
32
import com .fasterxml .jackson .core .JsonGenerator ;
50
51
import org .springframework .context .annotation .Lazy ;
51
52
import org .springframework .hateoas .Links ;
52
53
import org .springframework .hateoas .server .LinkRelationProvider ;
54
+ import org .springframework .lang .NonNull ;
55
+ import org .springframework .util .ReflectionUtils ;
53
56
54
57
/**
55
58
* The type Spring doc hateoas configuration.
@@ -89,7 +92,7 @@ HateoasHalProvider hateoasHalProvider(Optional<HateoasProperties> hateoasPropert
89
92
@ ConditionalOnMissingBean
90
93
@ Lazy (false )
91
94
CollectionModelContentConverter collectionModelContentConverter (HateoasHalProvider halProvider , LinkRelationProvider linkRelationProvider ) {
92
- return halProvider . isHalEnabled () ? new CollectionModelContentConverter (linkRelationProvider ) : null ;
95
+ return isHalEnabled (halProvider ) ? new CollectionModelContentConverter (linkRelationProvider ) : null ;
93
96
}
94
97
95
98
/**
@@ -105,7 +108,7 @@ CollectionModelContentConverter collectionModelContentConverter(HateoasHalProvid
105
108
@ ConditionalOnMissingBean (name = Constants .LINKS_SCHEMA_CUSTOMIZER )
106
109
@ Lazy (false )
107
110
GlobalOpenApiCustomizer linksSchemaCustomizer (HateoasHalProvider halProvider , SpringDocConfigProperties springDocConfigProperties ) {
108
- if (! halProvider . isHalEnabled ()) {
111
+ if (isHalEnabled (halProvider )) {
109
112
return openApi -> {
110
113
};
111
114
}
@@ -124,6 +127,24 @@ GlobalOpenApiCustomizer linksSchemaCustomizer(HateoasHalProvider halProvider, Sp
124
127
HateoasLinksConverter hateoasLinksConverter (ObjectMapperProvider springDocObjectMapper ) {
125
128
return new HateoasLinksConverter (springDocObjectMapper ) ;
126
129
}
127
-
128
-
129
- }
130
+
131
+ private boolean isHalEnabled (@ NonNull HateoasHalProvider halProvider ) {
132
+ // in SB 3.5.0 isHalEnabled was renamed to isUseHalAsDefaultJsonMediaType
133
+ // We have to use reflection to support both versions
134
+ var possibleMethodNames = List .of ("isUseHalAsDefaultJsonMediaType" , "isHalEnabled" );
135
+
136
+ for (var methodName : possibleMethodNames ) {
137
+ var method = ReflectionUtils .findMethod (halProvider .getClass (), methodName );
138
+ if (method != null ) {
139
+ var retval = ReflectionUtils .invokeMethod (method , halProvider );
140
+ if (retval == null ) {
141
+ throw new IllegalStateException ("Unable to determine if HAL is enabled" );
142
+ }
143
+
144
+ return (Boolean ) retval ;
145
+ }
146
+ }
147
+
148
+ throw new IllegalStateException ("Unable to determine if HAL is enabled, no method found" );
149
+ }
150
+ }
0 commit comments