如何在不使用@EnableHypermediaSupport和Spring hateoas的情况下启用HAL渲染?

时间:2014-01-10 09:48:52

标签: java spring spring-mvc hateoas spring-hateoas

使用@EnableHypermediaSupport(type = HypermediaType.HAL) Spring hateoas提供了一种简单方便的方法来启用HAL渲染。

注释触发了一些配置魔法,这里解释: https://github.com/spring-projects/spring-hateoas#enablehypermediasupport

但是,如果您正在使用基于xml-config的弹簧应用程序,则集成@EnableHypermediaSupport并不容易。我尝试了很多不同的方法来启用HAL渲染,但没有一个解决方案正常工作:

  • 在现有mvc servlet xml配置中包含配置类。
  • 使用不同版本的spring hateos(0.70.0,0.80.0,0.9.0.BUILD-SNAPSHOT),希望0.90.0会产生开箱即用的HAL,因为根据jira问题,它应该成为默认渲染(至少对于Spring数据休息)。
  • 使用自定义MappingJackson2HttpMessageConverter注册new Jackson2HalModule()也不起作用。尽管转换器用于渲染(例如渲染日期),但输出未在HAL中呈现。

因此我的问题:如何在不使用EnableHypermediaSupport的情况下启用HAL渲染?

我故意遗漏任何代码段,因为我认为它不会有太多帮助。

2 个答案:

答案 0 :(得分:3)

基于@WaldemarSchneider answer,这是一个具体的操作方法:

创建HTTP消息转换器:

public class HalHttpMessageConverter extends AbstractJackson2HttpMessageConverter {

  public HalHttpMessageConverter() {
    super(new ObjectMapper(), new MediaType("application", "hal+json", DEFAULT_CHARSET));
    objectMapper.registerModule(new Jackson2HalModule());
    objectMapper.setHandlerInstantiator(new Jackson2HalModule.HalHandlerInstantiator(new DefaultRelProvider(), null));
    // customize your mapper if needed
    objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
  }

  @Override
  protected boolean supports(Class<?> clazz) {
    return ResourceSupport.class.isAssignableFrom(clazz);
  }

}

在servlet上下文中注册它:

<mvc:annotation-driven>
  <mvc:message-converters>
    <bean class="package.to.HalHttpMessageConverter" />
  </mvc:message-converters>
</mvc:annotation-driven>

并且不要忘记让你的休息控制器产生application/hal+json

@RestController
@RequestMapping(value = "/articles", produces = "application/hal+json")
public class ArticleRestController {
  ...
}

答案 1 :(得分:1)

也许这个问题有点旧,但我想为以下用户提供我的解决方案。

我有类似的情况(Spring MVC 3.2.10.RELEASE,Spring HATEAOS 0.16.0.RELEASE)来配置spring hateoas以使用没有java配置的超媒体。

我的解决方案如下:

创建一个自定义的HalJacksonHttpMessageConverter(其作用类似于Spring MVC标准MappingJacksonHttpMessageConverter,它还必须有一个暴露ObjectMapper的方法),但将application / hal + json注册为支持的hypermediatypes。如果给定的类可以从ResourceSupport分配,则supports方法应该返回true。

在xml配置中创建一个RelProvider(DefaultRelProvider在这种情况下满足了我的需求)。

我创建了一个BeanPostProcessorBean(实现的接口:BeanPostProcessor和BeanFactoryAware)。 使用以下设置从我的HalJachsonHttpMessageConverter中丰富现有的ObjectMapper:

// retrieve the object mapper from the messageConverter
RelProvider provider = beanFactory.getBean("relProvider", RelProvider.class);
ObjectMapper mapper = (ObjectMapper) objectMapper;
mapper.registerModule(new Jackson2HalModule());
mapper.setHandlerInstantiator(new Jackson2HalModule.HalHandlerInstantiator(provider, null));
mapper.enable(SerializationFeature.INDENT_OUTPUT);

在spring bean xml中注册这些bean。 我希望这有帮助。如果有人有更好的配置方法,请告诉我。