77package org .hibernate .boot .internal ;
88
99import java .lang .reflect .Constructor ;
10+ import java .lang .reflect .InvocationTargetException ;
1011import java .time .ZoneId ;
1112import java .util .ArrayList ;
1213import java .util .Collections ;
7071import org .hibernate .resource .transaction .spi .TransactionCoordinatorBuilder ;
7172import org .hibernate .stat .Statistics ;
7273import org .hibernate .type .format .FormatMapper ;
74+ import org .hibernate .type .format .FormatMapperCreationContext ;
7375import org .hibernate .type .format .jackson .JacksonIntegration ;
7476import org .hibernate .type .format .jakartajson .JakartaJsonIntegration ;
7577import org .hibernate .type .format .jaxb .JaxbXmlFormatMapper ;
@@ -313,13 +315,23 @@ public SessionFactoryOptionsBuilder(StandardServiceRegistry serviceRegistry, Boo
313315 AvailableSettings .JPA_VALIDATION_FACTORY ,
314316 configurationSettings .get ( AvailableSettings .JAKARTA_VALIDATION_FACTORY )
315317 );
316- this .jsonFormatMapper = determineJsonFormatMapper (
318+
319+ final var formatMapperCreationContext = new FormatMapperCreationContext () {
320+ @ Override
321+ public BootstrapContext getBootstrapContext () {
322+ return context ;
323+ }
324+ };
325+ jsonFormatMapper = jsonFormatMapper (
317326 configurationSettings .get ( AvailableSettings .JSON_FORMAT_MAPPER ),
318- strategySelector
327+ strategySelector ,
328+ formatMapperCreationContext
319329 );
320- this .xmlFormatMapper = determineXmlFormatMapper (
330+
331+ xmlFormatMapper = xmlFormatMapper (
321332 configurationSettings .get ( AvailableSettings .XML_FORMAT_MAPPER ),
322- strategySelector
333+ strategySelector ,
334+ formatMapperCreationContext
323335 );
324336
325337 this .sessionFactoryName = (String ) configurationSettings .get ( SESSION_FACTORY_NAME );
@@ -827,7 +839,7 @@ private static Supplier<? extends Interceptor> interceptorSupplier(Class<? exten
827839 }
828840
829841 private PhysicalConnectionHandlingMode interpretConnectionHandlingMode (
830- Map <String ,Object > configurationSettings ,
842+ Map <String , Object > configurationSettings ,
831843 StandardServiceRegistry serviceRegistry ) {
832844 final PhysicalConnectionHandlingMode specifiedHandlingMode = PhysicalConnectionHandlingMode .interpret (
833845 configurationSettings .get ( CONNECTION_HANDLING )
@@ -840,36 +852,62 @@ private PhysicalConnectionHandlingMode interpretConnectionHandlingMode(
840852 return serviceRegistry .requireService ( TransactionCoordinatorBuilder .class ).getDefaultConnectionHandlingMode ();
841853 }
842854
843- private static FormatMapper determineJsonFormatMapper (Object setting , StrategySelector strategySelector ) {
844- return strategySelector .resolveDefaultableStrategy (
845- FormatMapper .class ,
855+ private static FormatMapper jsonFormatMapper (Object setting , StrategySelector selector , FormatMapperCreationContext creationContext ) {
856+ return formatMapper (
846857 setting ,
847- (Callable <FormatMapper >) () -> {
848- final FormatMapper jsonJacksonFormatMapper = JacksonIntegration .getJsonJacksonFormatMapperOrNull ();
849- if (jsonJacksonFormatMapper != null ) {
850- return jsonJacksonFormatMapper ;
851- }
852- else {
853- return JakartaJsonIntegration .getJakartaJsonBFormatMapperOrNull ();
854- }
855- }
858+ selector ,
859+ () -> {
860+ final FormatMapper jsonJacksonFormatMapper = JacksonIntegration .getJsonJacksonFormatMapperOrNull ( creationContext );
861+ return jsonJacksonFormatMapper != null
862+ ? jsonJacksonFormatMapper
863+ : JakartaJsonIntegration .getJakartaJsonBFormatMapperOrNull ();
864+ },
865+ creationContext
856866 );
857867 }
858868
859- private static FormatMapper determineXmlFormatMapper (Object setting , StrategySelector strategySelector ) {
860- return strategySelector .resolveDefaultableStrategy (
861- FormatMapper .class ,
869+ private static FormatMapper xmlFormatMapper (Object setting , StrategySelector selector , FormatMapperCreationContext creationContext ) {
870+ return formatMapper (
862871 setting ,
863- (Callable <FormatMapper >) () -> {
864- final FormatMapper jacksonFormatMapper = JacksonIntegration .getXMLJacksonFormatMapperOrNull ();
865- if (jacksonFormatMapper != null ) {
866- return jacksonFormatMapper ;
867- }
868- return new JaxbXmlFormatMapper ();
869- }
872+ selector ,
873+ () -> {
874+ final FormatMapper jacksonFormatMapper = JacksonIntegration .getXMLJacksonFormatMapperOrNull ( creationContext );
875+ return jacksonFormatMapper != null
876+ ? jacksonFormatMapper
877+ : new JaxbXmlFormatMapper ();
878+ },
879+ creationContext
870880 );
871881 }
872882
883+ private static FormatMapper formatMapper (Object setting , StrategySelector selector , Callable <FormatMapper > defaultResolver , FormatMapperCreationContext creationContext ) {
884+ return selector .resolveStrategy ( FormatMapper .class , setting , defaultResolver , strategyClass -> {
885+ try {
886+ final Constructor <? extends FormatMapper > creationContextConstructor =
887+ strategyClass .getDeclaredConstructor ( FormatMapperCreationContext .class );
888+ return creationContextConstructor .newInstance ( creationContext );
889+ }
890+ catch (NoSuchMethodException e ) {
891+ // Ignore
892+ }
893+ catch (InvocationTargetException | InstantiationException | IllegalAccessException e ) {
894+ throw new StrategySelectionException (
895+ String .format ( "Could not instantiate named strategy class [%s]" , strategyClass .getName () ),
896+ e
897+ );
898+ }
899+ try {
900+ return strategyClass .getDeclaredConstructor ().newInstance ();
901+ }
902+ catch (Exception e ) {
903+ throw new StrategySelectionException (
904+ String .format ( "Could not instantiate named strategy class [%s]" , strategyClass .getName () ),
905+ e
906+ );
907+ }
908+ } );
909+ }
910+
873911
874912 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
875913 // SessionFactoryOptionsState
0 commit comments