104104import org .springframework .hateoas .mediatype .hal .HalConfiguration ;
105105import org .springframework .hateoas .mediatype .hal .Jackson2HalModule ;
106106import org .springframework .hateoas .mediatype .hal .Jackson2HalModule .HalHandlerInstantiator ;
107+ import org .springframework .hateoas .mediatype .hal .forms .HalFormsConfiguration ;
108+ import org .springframework .hateoas .mediatype .hal .forms .Jackson2HalFormsModule ;
107109import org .springframework .hateoas .server .LinkRelationProvider ;
108110import org .springframework .hateoas .server .core .EvoInflectorLinkRelationProvider ;
109111import org .springframework .hateoas .server .mvc .RepresentationModelProcessorInvoker ;
143145 * @author Christoph Strobl
144146 */
145147@ Configuration (proxyBeanMethods = false )
146- @ EnableHypermediaSupport (type = HypermediaType .HAL )
148+ @ EnableHypermediaSupport (type = { HypermediaType .HAL , HypermediaType . HAL_FORMS } )
147149@ ImportResource ("classpath*:META-INF/spring-data-rest/**/*.xml" )
148150@ Import ({ RestControllerImportSelector .class , //
149151 SpringDataJacksonConfiguration .class , //
@@ -573,13 +575,45 @@ public TypeConstrainedMappingJackson2HttpMessageConverter halJacksonHttpMessageC
573575 return converter ;
574576 }
575577
578+ /**
579+ * {@link HttpMessageConverter} to support rendering HAL FORMS.
580+ *
581+ * @param linkCollector
582+ * @return
583+ * @since 3.5
584+ */
585+ @ Bean
586+ TypeConstrainedMappingJackson2HttpMessageConverter halFormsJacksonHttpMessageConverter (LinkCollector linkCollector ) {
587+
588+ LinkRelationProvider defaultedRelProvider = this .relProvider .getIfUnique (EvoInflectorLinkRelationProvider ::new );
589+ HalFormsConfiguration configuration = new HalFormsConfiguration (
590+ halConfiguration .getIfUnique (() -> new HalConfiguration ()));
591+ CurieProvider curieProvider = this .curieProvider
592+ .getIfUnique (() -> new DefaultCurieProvider (Collections .emptyMap ()));
593+ ObjectMapper mapper = basicObjectMapper ();
594+
595+ mapper .registerModule (persistentEntityJackson2Module (linkCollector ));
596+ mapper .registerModule (new Jackson2HalFormsModule ());
597+ mapper .setHandlerInstantiator (new Jackson2HalModule .HalHandlerInstantiator (
598+ defaultedRelProvider , curieProvider , resolver .getObject (), configuration .getHalConfiguration (),
599+ applicationContext .getAutowireCapableBeanFactory ()));
600+
601+ TypeConstrainedMappingJackson2HttpMessageConverter converter = new TypeConstrainedMappingJackson2HttpMessageConverter (
602+ RepresentationModel .class );
603+ converter .setSupportedMediaTypes (Collections .singletonList (MediaTypes .HAL_FORMS_JSON ));
604+ converter .setObjectMapper (mapper );
605+
606+ return converter ;
607+ }
608+
576609 public ObjectMapper halObjectMapper (LinkCollector linkCollector ) {
577610
578611 LinkRelationProvider defaultedRelProvider = this .relProvider .getIfUnique (EvoInflectorLinkRelationProvider ::new );
579612 HalConfiguration halConfiguration = this .halConfiguration .getIfUnique (HalConfiguration ::new );
580- HalHandlerInstantiator instantiator = new HalHandlerInstantiator (defaultedRelProvider ,
581- curieProvider .getIfUnique (() -> new DefaultCurieProvider (Collections .emptyMap ())), resolver .getObject (),
582- halConfiguration , applicationContext .getAutowireCapableBeanFactory ());
613+ CurieProvider curieProvider = this .curieProvider
614+ .getIfUnique (() -> new DefaultCurieProvider (Collections .emptyMap ()));
615+ HalHandlerInstantiator instantiator = new HalHandlerInstantiator (defaultedRelProvider , curieProvider ,
616+ resolver .getObject (), halConfiguration , applicationContext .getAutowireCapableBeanFactory ());
583617
584618 ObjectMapper mapper = basicObjectMapper ();
585619 mapper .registerModule (persistentEntityJackson2Module (linkCollector ));
@@ -739,6 +773,7 @@ public RepositoryInvokerFactory repositoryInvokerFactory() {
739773 public List <HttpMessageConverter <?>> defaultMessageConverters (
740774 @ Qualifier ("jacksonHttpMessageConverter" ) TypeConstrainedMappingJackson2HttpMessageConverter jacksonHttpMessageConverter ,
741775 @ Qualifier ("halJacksonHttpMessageConverter" ) TypeConstrainedMappingJackson2HttpMessageConverter halJacksonHttpMessageConverter ,
776+ @ Qualifier ("halFormsJacksonHttpMessageConverter" ) TypeConstrainedMappingJackson2HttpMessageConverter halFormsJacksonHttpMessageConverter ,
742777 AlpsJsonHttpMessageConverter alpsJsonHttpMessageConverter ,
743778 UriListHttpMessageConverter uriListHttpMessageConverter , RepositoryRestConfigurerDelegate configurerDelegate ,
744779 RepositoryRestConfiguration repositoryRestConfiguration ) {
@@ -757,6 +792,8 @@ public List<HttpMessageConverter<?>> defaultMessageConverters(
757792 messageConverters .add (halJacksonHttpMessageConverter );
758793 }
759794
795+ messageConverters .add (halFormsJacksonHttpMessageConverter );
796+
760797 MappingJackson2HttpMessageConverter fallbackJsonConverter = new MappingJackson2HttpMessageConverter ();
761798 fallbackJsonConverter .setObjectMapper (basicObjectMapper ());
762799
0 commit comments