6

Spring を使用@EnableHypermediaSupport(type = HypermediaType.HAL)すると、hateoas は HAL レンダリングを有効にする簡単で便利な方法を提供します。

注釈は、ここで説明されているいくつかの構成マジックをトリガーします: https://github.com/spring-projects/spring-hateoas#enablehypermediasupport

ただし、特定の xml-config ベースの Spring アプリケーションで作業している場合、@EnableHypermediaSupport を統合するのは簡単ではありません。HAL レンダリングを有効にするためにさまざまな方法を試しましたが、正しく機能するソリューションは 1 つもありませんでした。

  • 既存の mvc サーブレット xml 構成に構成クラスを含めます。
  • jiraの問題によると、それがデフォルトになるはずなので、0.90.0が箱から出してすぐにHALを生成することを期待して、Spring Hateoの異なるバージョン(0.70.0、0.80.0、0.9.0.BUILD-SNAPSHOT)を使用しますレンダリング(少なくとも春のデータレスト用)。
  • カスタムMappingJackson2HttpMessageConverterを使用して を登録してnew Jackson2HalModule()も機能しませんでした。コンバーターはレンダリング (日付のレンダリングなど) に使用されましたが、出力は HAL でレンダリングされませんでした。

したがって、私の質問: EnableHypermediaSupport を使用せずに HAL レンダリングを有効にするにはどうすればよいですか?

あまり役に立たないと思うので、意図的にコード スニペットを省略しました。

4

2 に答える 2

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);
  }

}

サーブレット コンテキストに登録します。

<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) で、Java 構成なしでハイパーメディアを使用するように Spring Hateoas を構成しました。

私の解決策は次のとおりです。

カスタム 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);

これらの Bean を Spring Bean xml に登録します。これが役立つことを願っています。誰かがより良い構成アプローチを持っている場合は、私に知らせてください。

于 2014-08-26T12:26:53.343 に答える