首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Traverson客户端和java.time.Instant的Spring HATEOAS

带有Traverson客户端和java.time.Instant的Spring HATEOAS
EN

Stack Overflow用户
提问于 2020-03-11 22:03:59
回答 2查看 158关注 0票数 0

当rest实体具有类型为"java.time.Instant“的属性时,将spring hateoas 1.0.3与traverson客户端一起使用会导致问题。我得到的错误是

代码语言:javascript
复制
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.Instant`

我发现traverson中RestTemplate内部使用的HttpMessageConverter只注册了Jackson2HalModule。

有没有办法在traverson中注册jackson-modules-java8模块?

或者,有没有一种方法可以在traverson之外在我的restTemplate中注册Jackson2HalModule?

EN

回答 2

Stack Overflow用户

发布于 2020-10-09 18:15:53

在spring-hateoas 1.1.2.RELEASE中,下面的内容对我很有效

代码语言:javascript
复制
private static RestTemplate getRestTemplate() {
    List<HttpMessageConverter<?>> httpMessageConverters = SpringFactoriesLoader.loadFactories(TraversonDefaults.class,
            Traverson.class.getClassLoader()).get(0).getHttpMessageConverters(Collections.singletonList(MediaTypes.HAL_JSON));
    Optional<HttpMessageConverter<?>> first = httpMessageConverters.stream().filter(i -> i instanceof MappingJackson2HttpMessageConverter)
            .findFirst();

    if (first.isPresent()) {
        MappingJackson2HttpMessageConverter httpMessageConverter = (MappingJackson2HttpMessageConverter) first.get();
        httpMessageConverter.getObjectMapper().registerModule(new JavaTimeModule());
    }

    return new RestTemplateBuilder().messageConverters(httpMessageConverters).build();
}

然后使用它:

代码语言:javascript
复制
Traverson traverson = new Traverson(URI.create("http://localhost:8080"), MediaTypes.HAL_JSON);
    traverson.setRestOperations(getRestTemplate());
票数 1
EN

Stack Overflow用户

发布于 2020-03-17 00:25:19

经过一番调查,我找到了一个适合我的解决方案。背景是traverson客户端使用包含Jackson2HalModule的注册MappingJackson2HttpMessageConverter。为了解决这个问题,我还必须注册JavaTimeModule。

我做了以下工作

代码语言:javascript
复制
RestTemplateBuilder genericBuilder = this.restTemplateBuilder
    .setConnectTimeout(Duration.ofMillis(configuration.getSecurityRestConnectTimeout()))
    .setReadTimeout(Duration.ofMillis(configuration.getSecurityRestReceiveTimeout()));

// my normal restTemplate
RestTemplateBuilder restTemplate = genericBuilder
                .defaultMessageConverters()
                .build();

// HAL specific restTemplate                
RestTemplateBuilder restTemplateHal = genericBuilder
                .messageConverters(getHalConverter(Arrays.asList(MediaTypes.HAL_JSON)))
                .build();

HalConverter是这样生成的(也注册JavaTimeModule):

代码语言:javascript
复制
   private static HttpMessageConverter<?> getHalConverter(List<MediaType> halFlavours) {

        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new Jackson2HalModule());
        mapper.registerModule(new JavaTimeModule());
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();

        converter.setObjectMapper(mapper);
        converter.setSupportedMediaTypes(halFlavours);

        return converter;
    }

然后,您可以使用Traverson设置刚刚生成的restTemplateHal

代码语言:javascript
复制
    Traverson traverson = new Traverson(uri, MediaTypes.HAL_JSON);
    traverson.setRestOperations(restTemplateHal);
    MyClass myclass = traverson.follow().toObject(MyClass.class);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60637899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档