2

RestTemplate を介して Spring-Data-Rest Web サービスに投稿しようとすると、ドメイン オブジェクトの JSON 表現が、HAL 表現ではない本格的な JSON オブジェクトに変換されます。ここでの私の仮定は、Jackson2HalModule をデシリアライザーとして登録する必要があるということですが、それを objectMapper に登録することを考えると、その方法がわかりません。シリアル化は、POST/PUT ではなく、Web サービスで GET を呼び出すときに正しく機能します。

リクエスト outputBuffer フィールド:

{
  "id" : 1,
  "name" : "Name",
  "description" : "",
  "childObject" : {
    "id" : 1,
    "name" : "test"
  }
} 

残りのテンプレートの構成:

@Bean
public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new JodaModule());
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    objectMapper.setDateFormat(new ISO8601DateFormat());
    objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
    objectMapper.registerModule(new Jackson2HalModule());
    return objectMapper;
}

public void configureMessageConverters(
        List<HttpMessageConverter<?>> messageConverters) {
    MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter();
    jsonMessageConverter.setObjectMapper(objectMapper());
    jsonMessageConverter.setSupportedMediaTypes(MediaType
            .parseMediaTypes("application/hal+json,application/json"));
    messageConverters.add(jsonMessageConverter);
}

@Bean
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
    configureMessageConverters(messageConverters);
    restTemplate.setMessageConverters(messageConverters);
    return restTemplate;
}

リクエスト ヘッダー:

  HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);

呼び出し方法:

ResponseEntity<DomainObject> responseEntity =
    restTemplate.exchange(this.getBaseUri() + resolveResource(), HttpMethod.POST, new HttpEntity(domainObject,createHttpHeaders(tenantId)), DomainObject.class);
4

1 に答える 1

0

独自の ObjectMapper を登録するべきではないと思います。Spring はそれを作成し、必要なすべてのモジュールも登録します。したがって、ObjectMapper Bean を削除しようとします。

ObjectMapper をカスタマイズする必要がある場合は、Jackson2ObjectMapperBuilder を使用できます。詳細については、ドキュメントを参照してください - http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-customize-the-jackson-objectmapper

@Bean
    public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
        return Jackson2ObjectMapperBuilder //
                .json() //
                .locale(ENGLISH) //
                .timeZone("UTC") //
                .indentOutput(true) //
                .serializationInclusion(NON_NULL) //
                .featuresToDisable(WRITE_DATES_AS_TIMESTAMPS, FAIL_ON_UNKNOWN_PROPERTIES) //
                ;
    }

また、Spring にメッセージ コンバーターを任せます。

したがって、RestTemplate を作成するときに、Spring にそれらを注入させます。つまり、次のようになります。

@Bean
public RestTemplate restTemplate(List<HttpMessageConverter<?>> messageConverters) {
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setMessageConverters(messageConverters);
    return restTemplate;
}
于 2015-09-24T14:03:22.470 に答える