1919import static org .skyscreamer .jsonassert .JSONAssert .*;
2020
2121import org .json .JSONException ;
22+ import org .jspecify .annotations .NonNull ;
2223import org .jspecify .annotations .Nullable ;
24+ import org .junit .jupiter .api .BeforeEach ;
2325import org .junit .jupiter .api .DisplayName ;
2426import org .junit .jupiter .api .Nested ;
2527import org .junit .jupiter .api .Test ;
28+ import org .springframework .beans .factory .annotation .Autowired ;
29+ import org .springframework .context .ApplicationContext ;
30+ import org .springframework .context .annotation .Bean ;
31+ import org .springframework .context .annotation .Configuration ;
2632import org .springframework .data .annotation .Id ;
2733import org .springframework .data .annotation .Version ;
2834import org .springframework .data .elasticsearch .annotations .Document ;
3844import org .springframework .data .mapping .model .PropertyNameFieldNamingStrategy ;
3945import org .springframework .data .mapping .model .SimpleTypeHolder ;
4046import org .springframework .data .util .TypeInformation ;
47+ import org .springframework .test .context .junit .jupiter .SpringJUnitConfig ;
4148import org .springframework .util .ReflectionUtils ;
4249
4350/**
@@ -60,9 +67,9 @@ class PropertiesTests {
6067 @ Test
6168 public void shouldThrowExceptionGivenVersionPropertyIsNotLong () {
6269
63- TypeInformation <EntityWithWrongVersionType > typeInformation = TypeInformation
70+ TypeInformation <@ NonNull EntityWithWrongVersionType > typeInformation = TypeInformation
6471 .of (EntityWithWrongVersionType .class );
65- SimpleElasticsearchPersistentEntity <EntityWithWrongVersionType > entity = new SimpleElasticsearchPersistentEntity <>(
72+ SimpleElasticsearchPersistentEntity <@ NonNull EntityWithWrongVersionType > entity = new SimpleElasticsearchPersistentEntity <>(
6673 typeInformation , contextConfiguration );
6774
6875 assertThatThrownBy (() -> createProperty (entity , "version" )).isInstanceOf (MappingException .class );
@@ -71,9 +78,9 @@ public void shouldThrowExceptionGivenVersionPropertyIsNotLong() {
7178 @ Test
7279 public void shouldThrowExceptionGivenMultipleVersionPropertiesArePresent () {
7380
74- TypeInformation <EntityWithMultipleVersionField > typeInformation = TypeInformation
81+ TypeInformation <@ NonNull EntityWithMultipleVersionField > typeInformation = TypeInformation
7582 .of (EntityWithMultipleVersionField .class );
76- SimpleElasticsearchPersistentEntity <EntityWithMultipleVersionField > entity = new SimpleElasticsearchPersistentEntity <>(
83+ SimpleElasticsearchPersistentEntity <@ NonNull EntityWithMultipleVersionField > entity = new SimpleElasticsearchPersistentEntity <>(
7784 typeInformation , contextConfiguration );
7885 SimpleElasticsearchPersistentProperty persistentProperty1 = createProperty (entity , "version1" );
7986 SimpleElasticsearchPersistentProperty persistentProperty2 = createProperty (entity , "version2" );
@@ -100,9 +107,9 @@ void shouldFindPropertiesByMappedName() {
100107 @ Test
101108 // DATAES-799
102109 void shouldReportThatThereIsNoSeqNoPrimaryTermPropertyWhenThereIsNoSuchProperty () {
103- TypeInformation <EntityWithoutSeqNoPrimaryTerm > typeInformation = TypeInformation
110+ TypeInformation <@ NonNull EntityWithoutSeqNoPrimaryTerm > typeInformation = TypeInformation
104111 .of (EntityWithoutSeqNoPrimaryTerm .class );
105- SimpleElasticsearchPersistentEntity <EntityWithoutSeqNoPrimaryTerm > entity = new SimpleElasticsearchPersistentEntity <>(
112+ SimpleElasticsearchPersistentEntity <@ NonNull EntityWithoutSeqNoPrimaryTerm > entity = new SimpleElasticsearchPersistentEntity <>(
106113 typeInformation , contextConfiguration );
107114
108115 assertThat (entity .hasSeqNoPrimaryTermProperty ()).isFalse ();
@@ -111,9 +118,9 @@ void shouldReportThatThereIsNoSeqNoPrimaryTermPropertyWhenThereIsNoSuchProperty(
111118 @ Test
112119 // DATAES-799
113120 void shouldReportThatThereIsSeqNoPrimaryTermPropertyWhenThereIsSuchProperty () {
114- TypeInformation <EntityWithSeqNoPrimaryTerm > typeInformation = TypeInformation
121+ TypeInformation <@ NonNull EntityWithSeqNoPrimaryTerm > typeInformation = TypeInformation
115122 .of (EntityWithSeqNoPrimaryTerm .class );
116- SimpleElasticsearchPersistentEntity <EntityWithSeqNoPrimaryTerm > entity = new SimpleElasticsearchPersistentEntity <>(
123+ SimpleElasticsearchPersistentEntity <@ NonNull EntityWithSeqNoPrimaryTerm > entity = new SimpleElasticsearchPersistentEntity <>(
117124 typeInformation , contextConfiguration );
118125
119126 entity .addPersistentProperty (createProperty (entity , "seqNoPrimaryTerm" ));
@@ -125,9 +132,9 @@ void shouldReportThatThereIsSeqNoPrimaryTermPropertyWhenThereIsSuchProperty() {
125132 // DATAES-799
126133 void shouldReturnSeqNoPrimaryTermPropertyWhenThereIsSuchProperty () {
127134
128- TypeInformation <EntityWithSeqNoPrimaryTerm > typeInformation = TypeInformation
135+ TypeInformation <@ NonNull EntityWithSeqNoPrimaryTerm > typeInformation = TypeInformation
129136 .of (EntityWithSeqNoPrimaryTerm .class );
130- SimpleElasticsearchPersistentEntity <EntityWithSeqNoPrimaryTerm > entity = new SimpleElasticsearchPersistentEntity <>(
137+ SimpleElasticsearchPersistentEntity <@ NonNull EntityWithSeqNoPrimaryTerm > entity = new SimpleElasticsearchPersistentEntity <>(
131138 typeInformation , contextConfiguration );
132139 entity .addPersistentProperty (createProperty (entity , "seqNoPrimaryTerm" ));
133140 EntityWithSeqNoPrimaryTerm instance = new EntityWithSeqNoPrimaryTerm ();
@@ -144,9 +151,9 @@ void shouldReturnSeqNoPrimaryTermPropertyWhenThereIsSuchProperty() {
144151 @ Test
145152 // DATAES-799
146153 void shouldNotAllowMoreThanOneSeqNoPrimaryTermProperties () {
147- TypeInformation <EntityWithSeqNoPrimaryTerm > typeInformation = TypeInformation
154+ TypeInformation <@ NonNull EntityWithSeqNoPrimaryTerm > typeInformation = TypeInformation
148155 .of (EntityWithSeqNoPrimaryTerm .class );
149- SimpleElasticsearchPersistentEntity <EntityWithSeqNoPrimaryTerm > entity = new SimpleElasticsearchPersistentEntity <>(
156+ SimpleElasticsearchPersistentEntity <@ NonNull EntityWithSeqNoPrimaryTerm > entity = new SimpleElasticsearchPersistentEntity <>(
150157 typeInformation , contextConfiguration );
151158 entity .addPersistentProperty (createProperty (entity , "seqNoPrimaryTerm" ));
152159
@@ -164,7 +171,24 @@ void shouldAllowFieldsWithIdPropertyNames() {
164171
165172 @ Nested
166173 @ DisplayName ("index settings" )
174+ @ SpringJUnitConfig ({ SettingsTests .Config .class })
167175 class SettingsTests {
176+ @ Autowired private ApplicationContext applicationContext ;
177+
178+ @ Configuration
179+ static class Config {
180+ @ Bean
181+ public SpelTestBean spelTestBean () {
182+ return new SpelTestBean ();
183+ }
184+ }
185+
186+ @ BeforeEach
187+ void setUp () {
188+ ((SimpleElasticsearchMappingContext ) elasticsearchConverter
189+ .get ().getMappingContext ()).setApplicationContext (applicationContext );
190+
191+ }
168192
169193 @ Test // #1719
170194 @ DisplayName ("should error if index sorting parameters do not have the same number of arguments" )
@@ -205,6 +229,24 @@ void shouldWriteSortParametersToSettingsObject() throws JSONException {
205229 String json = entity .getDefaultSettings ().toJson ();
206230 assertEquals (expected , json , false );
207231 }
232+
233+ @ Test // #3187
234+ @ DisplayName ("should evaluate SpEL expression in settingPath" )
235+ void shouldEvaluateSpElExpressionInSettingPath () {
236+
237+ var settingPath = elasticsearchConverter .get ().getMappingContext ()
238+ .getRequiredPersistentEntity (SettingPathWithSpel .class ).settingPath ();
239+
240+ assertThat (settingPath ).isEqualTo (SpelTestBean .SETTING_PATH );
241+ }
242+
243+ private static class SpelTestBean {
244+ public static String SETTING_PATH = "test-setting-path" ;
245+
246+ public String settingPath () {
247+ return SETTING_PATH ;
248+ }
249+ }
208250 }
209251
210252 @ Nested
@@ -271,7 +313,7 @@ void shouldWriteTypeHintsWhenConfiguredExplicitlyOnEntityAndGlobalSettingIsFalse
271313 }
272314 }
273315
274- // region helper functions
316+ // region helper
275317 private static SimpleElasticsearchPersistentProperty createProperty (SimpleElasticsearchPersistentEntity <?> entity ,
276318 String fieldName ) {
277319
@@ -282,6 +324,7 @@ private static SimpleElasticsearchPersistentProperty createProperty(SimpleElasti
282324 return new SimpleElasticsearchPersistentProperty (property , entity , SimpleTypeHolder .DEFAULT );
283325
284326 }
327+
285328 // endregion
286329
287330 // region entities
@@ -295,7 +338,7 @@ public String getVersion() {
295338 return version ;
296339 }
297340
298- public void setVersion (String version ) {
341+ public void setVersion (@ Nullable String version ) {
299342 this .version = version ;
300343 }
301344 }
@@ -313,7 +356,7 @@ public Long getVersion1() {
313356 return version1 ;
314357 }
315358
316- public void setVersion1 (Long version1 ) {
359+ public void setVersion1 (@ Nullable Long version1 ) {
317360 this .version1 = version1 ;
318361 }
319362
@@ -322,7 +365,7 @@ public Long getVersion2() {
322365 return version2 ;
323366 }
324367
325- public void setVersion2 (Long version2 ) {
368+ public void setVersion2 (@ Nullable Long version2 ) {
326369 this .version2 = version2 ;
327370 }
328371 }
@@ -397,5 +440,12 @@ private static class EnableTypeHintExplicitSetting {
397440 @ Nullable
398441 @ Id String id ;
399442 }
443+
444+ @ Document (indexName = "foo" )
445+ @ Setting (settingPath = "#{@spelTestBean.settingPath}" )
446+ private static class SettingPathWithSpel {
447+ @ Nullable
448+ @ Id String id ;
449+ }
400450 // endregion
401451}
0 commit comments