使用@EnableHypermediaSupport(type = HypermediaType.HAL)
Spring hateoas提供了一种简单方便的方法来启用HAL渲染。
注释触发了一些配置魔法,这里解释: https://github.com/spring-projects/spring-hateoas#enablehypermediasupport
但是,如果您正在使用基于xml-config的弹簧应用程序,则集成@EnableHypermediaSupport并不容易。我尝试了很多不同的方法来启用HAL渲染,但没有一个解决方案正常工作:
MappingJackson2HttpMessageConverter
注册new Jackson2HalModule()
也不起作用。尽管转换器用于渲染(例如渲染日期),但输出未在HAL中呈现。因此我的问题:如何在不使用EnableHypermediaSupport的情况下启用HAL渲染?
我故意遗漏任何代码段,因为我认为它不会有太多帮助。
答案 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。 我希望这有帮助。如果有人有更好的配置方法,请告诉我。