6

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

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

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

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

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

我故意省略了任何代码片段,因为我认为这不会有太大帮助。

4

2 回答 2

3

基于@WaldemarSchneider 的回答,这里有一个具体的操作方法:

创建一个 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 {
  ...
}
于 2015-07-03T12:51:47.110 回答
2

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

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

我的解决方案如下:

创建一个自定义 HalJacksonHttpMessageConverter(其作用类似于 Spring MVC 标准 MappingJacksonHttpMessageConverter,它还必须有一个公开 ObjectMapper 的方法),但将 application/hal+json 注册为支持的超媒体类型。如果给定的类可从 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。我希望这有帮助。如果有人有更好的配置方法,请告诉我。

于 2014-08-26T12:26:53.343 回答